如何自定义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];
效果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值