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:titledelegate:delegatecancelButtonTitle:cancelButtonTitle
destructiveButtonTitle:destructiveButtonTitle
otherButtonTitles:otherButtonTitles,nil];
if(self) {
titleImage=image;
[titleImage retain];
UIImageView *imageView=[[UIImageView alloc] initWithImage:titleImage];
imageView.frame =CGRectZero;
//for(UIView*subViewinself.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*viewinself.subviews ){
if([view isKindOfClass:[UILabelclass]]) {
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*viewinself.subviews){
if(![view isKindOfClass:[UILabel class]]) {
if([view isKindOfClass:[UIImageViewclass]]){
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];
解决的办法是继承它,实现一个自定义类,重载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:titledelegate:delegatecancelButtonTitle:cancelButtonTitle
destructiveButtonTitle:destructiveButtonTitle
otherButtonTitles:otherButtonTitles,nil];
if(self) {
titleImage=image;
[titleImage retain];
UIImageView *imageView=[[UIImageView alloc] initWithImage:titleImage];
imageView.frame =CGRectZero;
//for(UIView*subViewinself.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*viewinself.subviews ){
if([view isKindOfClass:[UILabelclass]]) {
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*viewinself.subviews){
if(![view isKindOfClass:[UILabel class]]) {
if([view isKindOfClass:[UIImageViewclass]]){
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