如何自定义UIActionSheet(UIAlertView)中的内容

UIActionSheet和UIAlertView因为UI有特殊的用途,所以本身并不允许你AddSubview之类的函数来自定义界面。解决的办法是继承它,实现一个自定义类,重载layoutSubviews函数

复制代码
//.h
#import <UIKit/UIKit.h>

@interface UIImageActionSheet : UIActionSheet {
    UIImage 
*titleImage;
}
-(id) initWithImage:(UIImage *)image 
              title:(NSString 
*)title 
           
delegate:(id <UIActionSheetDelegate>)delegate 
  cancelButtonTitle:(NSString 
*)cancelButtonTitle 
destructiveButtonTitle:(NSString 
*)destructiveButtonTitle 
  otherButtonTitles:(NSString 
*)otherButtonTitles;
复制代码

@end 

 

复制代码
//.m file
#import "UIImageActionSheet.h"


@implementation UIImageActionSheet
-(id) initWithImage:(UIImage *)image 
              title:(NSString 
*)title
           
delegate:(id <UIActionSheetDelegate>)delegate 
  cancelButtonTitle:(NSString 
*)cancelButtonTitle 
destructiveButtonTitle:(NSString 
*)destructiveButtonTitle 
  otherButtonTitles:(NSString 
*)otherButtonTitles{
    
    self 
= [super initWithTitle:title delegate:delegate 
              cancelButtonTitle:cancelButtonTitle 
         destructiveButtonTitle:destructiveButtonTitle 
              otherButtonTitles:otherButtonTitles,nil];
    
    
if (self) {
        titleImage
=image;
        [titleImage retain];
        UIImageView 
*imageView = [[UIImageView alloc] initWithImage:titleImage];
        imageView.frame 
= CGRectZero;         
        
// 
        for (UIView *subView in self.subviews){
            
if (![subView isKindOfClass:[UILabel class]]) {
                [self insertSubview:imageView aboveSubview:subView];
                
break;
            }
        }
        
        [imageView release];
    }
    
return self;
}


- (CGFloat) maxLabelYCoordinate {
    
// Determine maximum y-coordinate of labels
    CGFloat maxY = 0;
    
for( UIView *view in self.subviews ){
        
if([view isKindOfClass:[UILabel class]]) {
            CGRect viewFrame 
= [view frame];
            CGFloat lowerY 
= viewFrame.origin.y + viewFrame.size.height;
            
if(lowerY > maxY)
                maxY 
= lowerY;
        }
    }
    
return maxY;
}

-(void) layoutSubviews{
    [super layoutSubviews];
    CGRect frame 
= [self frame];
    CGFloat labelMaxY 
= [self maxLabelYCoordinate];

    
for(UIView *view in self.subviews){
        
if (![view isKindOfClass:[UILabel class]]) {    
            
if([view isKindOfClass:[UIImageView class]]){
                CGRect viewFrame 
= CGRectMake((320 - titleImage.size.width)/2, labelMaxY + 10,
                                              titleImage.size.width, titleImage.size.height);
                [view setFrame:viewFrame];
            } 
            
else if(![view isKindOfClass:[UIImageView class]]) {
                CGRect viewFrame 
= [view frame];
                viewFrame.origin.y 
+= titleImage.size.height+10;
                [view setFrame:viewFrame];
            }
        }
    }
    
    frame.origin.y 
-= titleImage.size.height + 2.0;
    frame.size.height 
+= titleImage.size.height + 2.0;
    [self setFrame:frame];

}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code.
}
*/

- (void)dealloc {
    [super dealloc];
    
if (titleImage) {
        [titleImage release];
    }
}


复制代码

@end

使用: 

 UIImage *tips3Img = [UIImage imageNamed:@"tips-3.png"];

复制代码
UIImageActionSheet *tipsActionSheet = [[UIImageActionSheet alloc] 
                                       initWithImage:tips3Img 
                                       title:
@"添加的图案可用以下方式调整" 
                                       
delegate:self cancelButtonTitle:@"知道了" 
                                       destructiveButtonTitle:nil 
                                       otherButtonTitles:nil];
tipsActionSheet.tag 
= kActionSheetTagTips;
[tipsActionSheet showInView:self.view];
[tipsActionSheet release];
复制代码

效果:

posted @   Think  阅读(7655)  评论(3编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示