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

UIActionSheet和UIAlertView因为UI有特殊的用途,所以本身并不允许你AddSubview之类的函数来自定义界面。
解决的办法是继承它,实现一个自定义类,重载layoutSubviews函数
#import <UIKit/UIKit.h>@interface UIImageActionSheet : UIActionSheet {
    UIImage 
*titleImage;
}
-(id) initWithImage:(UIImage *)image 
              title:(NSString 
*)title 
           
delegate:(id <UIActionSheetDelegate>)delegatecancelButtonTitle:(NSString *)cancelButtonTitle 
destructiveButtonTitle:(NSString 
*)destructiveButtonTitle 
  otherButtonTitles:(NSString 
*)otherButtonTitles;

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


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

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

    
for(UIView *view inself.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];
            } 
            
elseif(![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];

效果:




图片:自定义UIActionSheet(UIAlertView)中的内容.png
posted @ 2015-12-28 15:03  Bo-tree  阅读(110)  评论(0)    收藏  举报