IOS custom alertView, inherited from UIView, you can add a subview, title image + Text
Custom alertView, inherited from UIView, you can add a subview in the message area: addCustomerSubview
The title can contain images and text. Only two buttons are supported.
//-Call the alertView show method on the Controller that requires alert
CustomAlertView * alertView = [[CustomAlertView alloc] initWithTitle: @ "prompt" message: @ "dylan_lwb _" delegate: self cancelButtonTitle: @ "OK" otherButtonTitles: nil]; // [alertView addCustomerSubview: myView]; [alertView show]; [alertView release]; //-proxy method-(void) alertView :( CustomAlertView *) alertView clickedButtonAtIndex :( NSInteger) buttonIndex {}-(void) alertViewClosed :( CustomAlertView *) alertView {}-(void) willPresentCustomAlertView :( UIView *) alertView {}
//-Create a CustomAlertView category in the project and copy all the following code.
# If defined (_ APPLE_CC _) & (_ APPLE_CC _> = 5549) # define NS_REQUIRES_NIL_TERMINATION _ attribute _ (sentinel ))) # else # define NS_REQUIRES_NIL_TERMINATION _ attribute _ (sentinel) # endif # define SCREEN_WIDTH [[UIScreen mainScreen] bounds]. size. width # define SCREEN_HEIGHT [[UIScreen mainScreen] bounds]. size. height # define RGBA_COLOR (r, g, B, a) [UIColor colorWithRed: r/255.0f green: g/255.0f blue: B/255.0f alpha: a] # define kBCAlertViewPresentNotify @ "kBCAlertViewPresentNotify" // alertview present presenty # import
# Import
@ Class CustomAlertView; @ protocol MBAlertViewDelegate
@ Optional //-proxy method-(void) alertView :( CustomAlertView *) alertView clickedButtonAtIndex :( NSInteger) buttonIndex;-(void) handle :( CustomAlertView *) alertView;-(void) willPresentCustomAlertView :( UIView *) alertView; //-hide the role class pop-up keyboard-(void) hideCurrentKeyBoard; @ end @ interface CustomAlertView: UIView {} @ property (nonatomic, assign) id
Delegate; @ property (nonatomic, assign) BOOL isNeedCloseBtn; //-the cross button with the upper left corner @ property (nonatomic, retain) NSString * title; @ property (nonatomic, retain) NSString * message; @ property (nonatomic, retain) UIView * backView; @ property (nonatomic, retain) UIView * titleBackgroundView; @ property (nonatomic, retain) UILabel * titleLabel; @ property (nonatomic, retain) UIImageView * titleIcon; @ property (nonatomic, retain) NSMutableArray * customerViewsToBeAdd;-(id) initWithTitle :( NSString *) title message :( NSString *) message delegate :( id) delegate cancelButtonTitle :( NSString *) cancelButtonTitle otherButtonTitles :( NSString *) otherButtonTitles ,... response;-(void) initTitle :( NSString *) title message :( NSString *) message delegate :( id) del cancelButtonTitle :( NSString *) cancelBtnTitle otherButtonTitles :( NSString *) otherBtnTitles ,... NS_REQUIRES_NIL_TERMINATION;-(void) show; //-Add a custom control in alertview-(void) addCustomerSubview :( UIView *) view; + (void) exChangeOut :( UIView *) changeOutView dur :( CFTimeInterval) dur; + (CustomAlertView *) defaultAlert; @ end
# Import "CustomAlertView. h "@ interface CustomAlertView () {BOOL _ isShow;} @ property (nonatomic, retain) NSString * cancelButtonTitle; @ property (nonatomic, retain) NSMutableArray * otherButtonTitles; @ end @ implementation CustomAlertViewstatic const CGFloat mWidth = 290; static const CGFloat mHeight = 180; static const CGFloat mMaxHeight = 250; static const CGFloat mBtnHeight = 30; static const CGFloat mBtnWidt H = 110; static const CGFloat mHeaderHeight = 40; + (CustomAlertView *) defaultAlert {static CustomAlertView * shareCenter = nil; if (! ShareCenter) {shareCenter = [[CustomAlertView alloc] init];} return shareCenter;}-(NSMutableArray *) customerViewsToBeAdd {if (_ customerViewsToBeAdd = nil) {_ customerViewsToBeAdd = [[NSMutableArray alloc] init];} return _ customerViewsToBeAdd;}-(id) init {self = [super initWithFrame: CGRectMake (0, 0, SCREEN_WIDTH, SCREEN_HEIGHT + 20)]; if (self) {_ isShow = NO;} return self;}-(id) initWithTitle :( N SString *) title message :( NSString *) message delegate :( id) del cancelButtonTitle :( NSString *) cancelBtnTitle otherButtonTitles :( NSString *) otherBtnTitles ,... {self = [super initWithFrame: CGRectMake (0, 0, SCREEN_WIDTH, SCREEN_HEIGHT + 20)]; if (self) {self. delegate = del; self. cancelButtonTitle = cancelBtnTitle; self. isNeedCloseBtn = NO; if (! _ OtherButtonTitles) {va_list argList; if (otherBtnTitles) {self. otherButtonTitles = [NSMutableArray array]; [self. otherButtonTitles addObject: otherBtnTitles];} va_start (argList, otherBtnTitles); id arg; while (arg = va_arg (argList, id) {[self. otherButtonTitles addObject: arg] ;}} self. title = title; self. message = message;} return self;}-(void) initTitle :( NSString *) title message :( NSString *) m Essage delegate :( id) del cancelButtonTitle :( NSString *) cancelBtnTitle otherButtonTitles :( NSString *) otherBtnTitles ,... {if (self) {self. delegate = del; self. cancelButtonTitle = cancelBtnTitle; self. isNeedCloseBtn = NO; if (! _ OtherButtonTitles) {va_list argList; if (otherBtnTitles) {self. otherButtonTitles = [NSMutableArray array]; [self. otherButtonTitles addObject: otherBtnTitles];} va_start (argList, otherBtnTitles); id arg; while (arg = va_arg (argList, id) {[self. otherButtonTitles addObject: arg] ;}} self. title = title; self. message = message ;}}- (void) layoutSubviews {[super layoutSubviews]; for (UIView * view In [self subviews]) {[view removeFromSuperview];} UIView * bgView = [[UIView alloc] initWithFrame: self. frame]; [bgView setBackgroundColor: [UIColor blackColor]; [bgView setAlpha: 0.4]; [self addSubview: bgView]; [bgView release]; if (! _ BackView) {_ backView = [[UIView alloc] initWithFrame: CGRectMake (0, 0, mWidth, mHeight)]; _ backView. opaque = NO; _ backView. backgroundColor = [UIColor whiteColor]; _ backView. layer. shadowOffset = CGSizeMake (1, 1); _ backView. layer. shadowRadius = 2.0; _ backView. layer. shadowColor = [UIColor grayColor]. CGColor; _ backView. layer. shadowOpacity = 0.8; [_ backView. layer setMasksToBounds: NO];} //-set the display area of the header/ /-Set the title background UIView * titleView = [[UIView alloc] initWithFrame: CGRectMake (0, 0, mWidth, mHeaderHeight)]; titleView. backgroundColor = RGBA_COLOR (36,193, 64, 1); CGSize titleSize = CGSizeZero; if (self. title & [self. title length]> 0) {titleSize = [self. title sizeWithFont: [UIFont fontWithName: @ "Helvetica-Bold" size: 18366f];} if (titleSize. width> 0) {//-title image CGFloat startX = (titleView. frame. si Ze. width-40-titleSize. width)/2; UIImageView * titleImage = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @ "xxxxx.png"]; titleImage. frame = CGRectMake (startX, (titleView. frame. size. height-30)/2, 30, 30); self. titleIcon = titleImage; [titleView addSubview: titleImage]; [titleImage release]; startX + = 40; //-title UILabel * titleLabel = [[UILabel alloc] initWithFrame: CGRectMake (startX, (TitleView. frame. size. height-20)/2, titleSize. width, 20)]; //-if the title is too long, you need to process if (titleLabel. frame. size. width & gt; 250) {titleLabel. frame = CGRectMake (50, (titleView. frame. size. height-20)/2, mWidth-60, 20); titleImage. frame = CGRectMake (5, (titleView. frame. size. height-30)/2, 30, 30);} titleLabel. text = self. title; titleLabel. font = [UIFont fontWithName: @ "Helvetica-Bold" size: 18366f]; tit LeLabel. textColor = [UIColor whiteColor]; titleLabel. backgroundColor = [UIColor clearColor]; self. titleLabel = titleLabel; [titleView addSubview: titleLabel]; [titleLabel release];} else {//-title image UIImageView * titleImage = [[UIImageView alloc] Subject: [UIImage imageNamed: @ "xxxxx.png"]; titleImage. frame = CGRectMake (titleView. frame. size. width-30)/2, (titleView. frame. size. height-30 )/ 2, 30, 30); [titleView addSubview: titleImage]; [titleImage release];} if (self. isNeedCloseBtn) {UIButton * btn = [[UIButton alloc] initWithFrame: CGRectMake (mWidth-mHeaderHeight, 0, mHeaderHeight, mHeaderHeight)]; btn. backgroundColor = [UIColor clearColor]; [btn setImage: [UIImage imageNamed: @ "success"] forState: UIControlStateNormal]; [btn addTarget: self action: @ selector (closeBtnCli Cked :) forControlEvents: UIControlEventTouchUpInside]; [titleView addSubview: btn]; [btn release];} [_ backView addSubview: titleView]; self. titleBackgroundView = titleView; [titleView release]; //-set UIScrollView * msgView = [[UIScrollView alloc] initWithFrame: CGRectMake (0, mHeaderHeight, mWidth, (mHeight-mHeaderHeight * 2)]; //-sets the background color msgView. backgroundColor = [UIColor whiteColor]; //-inner CGSize messageSize = CGSizeZero; if (self. message & [self. message length]> 0) {messageSize = [self. message sizeWithFont: [UIFont systemFontOfSize: 16366f] constrainedToSize: CGSizeMake (mWidth-20, MAXFLOAT) lineBreakMode: NSLineBreakByWordWrapping]; if (messageSize. width> 0) {UILabel * msgLabel = [[UILabel alloc] init]; msgLabel. font = [UIFont systemFontOfSize: 16366f]; msgLabel. text = self. message; m SgLabel. numberOfLines = 0; msgLabel. textAlignment = NSTextAlignmentCenter; msgLabel. backgroundColor = [UIColor clearColor]; msgLabel. frame = CGRectMake (10, (mHeight-mHeaderHeight * 2)-messageSize. height)/2, mWidth-20, messageSize. height + 5); if (messageSize. height> mMaxHeight) {msgView. frame = CGRectMake (msgView. frame. origin. x, msgView. frame. origin. y, msgView. frame. size. width, mMaxHeight + 25); _ backView. frame = CGRectMake (0, 0, mWidth, mHeaderHeight * 2 + msgView. frame. size. height); msgLabel. textAlignment = NSTextAlignmentLeft; msgLabel. frame = CGRectMake (10, 10, mWidth-20, messageSize. height); msgView. contentSize = CGSizeMake (msgView. frame. size. width, msgLabel. frame. size. height + 20);} else if (messageSize. height> (mHeight-mHeaderHeight * 2)-10) {msgView. frame = CGRectMak E (msgView. frame. origin. x, msgView. frame. origin. y, msgView. frame. size. width, messageSize. height + 25); _ backView. frame = CGRectMake (0, 0, mWidth, mHeaderHeight * 2 + msgView. frame. size. height); msgLabel. frame = CGRectMake (10, 10, mWidth-20, messageSize. height + 5);} [msgView addSubview: msgLabel]; [msgLabel release]; [_ backView addSubview: msgView];} else {if (self. customerViewsToBeAdd & [self. CustomerViewsToBeAdd count]> 0) {CGFloat startY = 0; for (UIView * subView in self. customerViewsToBeAdd) {CGRect rect = subView. frame; rect. origin. y = startY; subView. frame = rect; [msgView addSubview: subView]; startY + = rect. size. height;} msgView. frame = CGRectMake (0, mHeaderHeight, mWidth, startY);} [_ backView addSubview: msgView]; _ backView. frame = CGRectMake (0, 0, mWidth, msgView. frame. size. Height + mHeaderHeight * 2 + 20);} [msgView release]; //-set the button to display the region if (_ otherButtonTitles! = Nil | _ cancelButtonTitle! = Nil) {UIView * btnView = [[UIView alloc] initWithFrame: CGRectMake (0, _ backView. frame. size. height-mHeaderHeight, mWidth, mHeaderHeight)]; //-if only one button is displayed, calculate the display size of the button if (_ otherButtonTitles = nil | _ cancelButtonTitle = nil) {UIButton * btn = [[UIButton alloc] initWithFrame: CGRectMake (_ backView. frame. size. width-mBtnWidth)/2, 0, mBtnWidth, mBtnHeight)]; btn. backgroundColor = RGBA_COLOR (36,193, 6 4, 1); btn. titleLabel. font = [UIFont fontWithName: @ "Helvetica" size: 17366f]; btn. titleLabel. textColor = [UIColor whiteColor]; [btn addTarget: self action: @ selector (buttonClicked :) forControlEvents: UIControlEventTouchUpInside]; if (_ otherButtonTitles = nil & _ cancelButtonTitle! = Nil) {[btn setTitle: _ cancelButtonTitle forState: UIControlStateNormal];} else {[btn setTitle: [_ otherButtonTitles objectAtIndex: 0] forState: UIControlStateNormal];} btn. tag = 0; btn. layer. cornerRadius = 5; [btnView addSubview: btn]; [btn release];} else if (_ otherButtonTitles & [_ otherButtonTitles count] = 1) {//-display two buttons //-set CGFloat startX = (_ backView. frame. size. width-mBtnWidth * 2-20)/2; UIButton * otherBtn = [[UIButton alloc] initWithFrame: CGRectMake (startX, 0, mBtnWidth, mBtnHeight)]; otherBtn. backgroundColor = RGBA_COLOR (36,193, 64, 1); otherBtn. titleLabel. font = [UIFont fontWithName: @ "Helvetica" size: 17366f]; otherBtn. titleLabel. textColor = [UIColor whiteColor]; [otherBtn setTitle: [_ otherButtonTitles objectAtIndex: 0] forState: UIControlStateNormal]; otherBtn. layer. corner Radius = 5; [otherBtn addTarget: self action: @ selector (buttonClicked :) forControlEvents: UIControlEventTouchUpInside]; otherBtn. tag = 0; [btnView addSubview: otherBtn]; [otherBtn release]; startX ++ = mBtnWidth + 20; //-set the UIButton * cancelBtn = [[UIButton alloc] initWithFrame: CGRectMake (startX, 0, mBtnWidth, mBtnHeight)]; cancelBtn. backgroundColor = RGBA_COLOR (36,193, 64, 1); cancelBtn. titleLa Bel. font = [UIFont fontWithName: @ "Helvetica" size: 17366f]; cancelBtn. titleLabel. textColor = [UIColor whiteColor]; [cancelBtn setTitle: _ cancelButtonTitle forState: UIControlStateNormal]; cancelBtn. layer. cornerRadius = 5; [cancelBtn addTarget: self action: @ selector (buttonClicked :) forControlEvents: UIControlEventTouchUpInside]; cancelBtn. tag = 1; [btnView addSubview: cancelBtn]; [cancelBtn release];} [_ BackView addSubview: btnView]; [btnView release];} else {CGRect rc = _ backView. frame; rc. size. height-= mHeaderHeight; _ backView. frame = rc;} UIControl * touchView = [[UIControl alloc] initWithFrame: self. frame]; [touchView addTarget: self action: @ selector (touchViewClickDown) forControlEvents: UIControlEventTouchDown]; touchView. frame = self. frame; [self addSubview: touchView]; [touchView release]; _ BackView. center = self. center; [self addSubview: _ backView]; if (! _ IsShow) [CustomAlertView exChangeOut: _ backView dur: 0.5]; if (self. delegate) {if ([self. delegate respondsToSelector: @ selector (willPresentCustomAlertView :)]) {[self. delegate willPresentCustomAlertView: self];} [[nsicationcenter center defacenter center] postNotificationName: kBCAlertViewPresentNotify object: nil userInfo: nil] ;}- (void) touchViewClickDown {if (self. delegate) {if ([self. delegate respondsT OSelector: @ selector (hideCurrentKeyBoard)]) {[self. delegate hideCurrentKeyBoard] ;}}//-set the custom control in the message area-(void) addCustomerSubview :( UIView *) view {[self. customerViewsToBeAdd addObject: view];}-(void) buttonClicked :( id) sender {UIButton * btn = (UIButton *) sender; _ isShow = NO; if (btn) {if (self. delegate & [self. delegate respondsToSelector: @ selector (alertView: clickedButtonAtIndex :)]) {[self. deltas Te alertView: self clickedButtonAtIndex: btn. tag];} [self removeFromSuperview];}-(void) closeBtnClicked :( id) sender {_ isShow = NO; if (self. delegate & [self. delegate respondsToSelector: @ selector (alertViewClosed :)]) {[self. delegate alertViewClosed: self];} [self removeFromSuperview];}-(void) show {[self layoutSubviews]; if (! _ IsShow) [[[UIApplication sharedApplication]. delegate window] addSubview: self]; _ isShow = YES;}-(void) dealloc {[_ backView release]; [_ mermerviewstobeadd release]; self. titleLabel = nil; self. titleBackgroundView = nil; self. titleIcon = nil; [super dealloc];} //-alertview animation + (void) exChangeOut :( UIView *) changeOutView dur :( CFTimeInterval) dur {CAKeyframeAnimation * animation; animation = [CAKeyframeAnimation animationWithKeyPath: @ "transform"]; animation. duration = dur; animation. removedOnCompletion = NO; animation. fillMode = modes; NSMutableArray * values = [NSMutableArray array]; [values addObject: [NSValue failed: Average (0.1, 0.1, 1.0)]; [values addObject: [NSValue failed: CATransform3DMakeScale (1.2, 1.2, 1.0)]; [values addObject: [NSValue hour: CATransform3DMakeScale (0.9, 0.9, 0.9)]; [values addObject: [NSValue hour: CATransform3DMakeScale (1.0, 1.0, 1.0)]; animation. values = values; animation. timingFunction = [CAMediaTimingFunction functionWithName: @ "easeInEaseOut"]; [changeOutView. layer addAnimation: animation forKey: nil];} @ end