code4App上面有很多很棒的UI特效代码,我们常感叹,好牛逼啊,这效果,太炫了,哇,怎么自己写不出来.其实,再炫的特效,都是根据苹果系统的框架而来,如果我们了解系统框架实现的原理,也就能写出属于自己自定义的控件,加上各种各样的动画.
这里,我就展示一个自定义的UIAlertView效果控件,视图出现的时候动画-先放大-再缩小-最后成正常比例,消失的时候缩小加渐隐.调用也很方便,不需要像系统先创建后[alert show],我在类内部就已经写好了,只需要alloc创建,调用各个按钮对应的响应block就行.
@.h
#import <UIKit/UIKit.h> typedef void(^Myblcok)(); @interface CustomAlertView : UIView - (id)initWithTitle:(NSString *)title cancelButtonTitle:(NSString *)cancelTitle firstButtonTitles:(NSString *)firstTitle senondButtonTitles:(NSString *)secondTitle thirdButtonTitles:(NSString *)thirdTitle; // 利用block将按钮的点击事件传出去 @property (nonatomic,copy)Myblcok cancelBlock; @property (nonatomic,copy)Myblcok firstBlcok; @property (nonatomic,copy)Myblcok secondBlock; @property (nonatomic,copy)Myblcok thirdBlock; @end @interface UIImage (colorful) + (UIImage *)imageWithColor:(UIColor *)color; @end@.m
// // CustomAlertView.m // CustomAlertView // // Created by 胡明涛 on 14-5-6. // Copyright (c) 2014年 胡明涛. All rights reserved. // #import "CustomAlertView.h" // 屏幕的物理高度 #define ScreenHeight [UIScreen mainScreen].bounds.size.height // 屏幕的物理宽度 #define ScreenWidth [UIScreen mainScreen].bounds.size.width #define AlertViewHeight 260 #define AlertViewWidth 200 @interface CustomAlertView () @property (nonatomic,strong) UIView *backgroundView; // 底部View,阻挡其他事件响应 @property (nonatomic,strong) UILabel *titleLabel; // 标题 @property (nonatomic,strong) UIButton *cancelButton; // 取消 @end @implementation CustomAlertView - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code } return self; } - (id)initWithTitle:(NSString *)title cancelButtonTitle:(NSString *)cancelTitle firstButtonTitles:(NSString *)firstTitle senondButtonTitles:(NSString *)secondTitle thirdButtonTitles:(NSString *)thirdTitle{ self = [super initWithFrame:CGRectMake((ScreenWidth - AlertViewWidth)/2.0, (ScreenHeight-AlertViewHeight)/2 ,AlertViewWidth, AlertViewHeight)]; if (self) { [self createCustomAlertView]; self.titleLabel.text = title; [self.cancelButton setTitle:cancelTitle forState:UIControlStateNormal]; if (thirdTitle != nil) { [((UIButton *)[self viewWithTag:200]) setTitle:firstTitle forState:UIControlStateNormal]; [((UIButton *)[self viewWithTag:201]) setTitle:secondTitle forState:UIControlStateNormal]; [((UIButton *)[self viewWithTag:202]) setTitle:thirdTitle forState:UIControlStateNormal]; }else{ [((UIButton *)[self viewWithTag:200]) setTitle:firstTitle forState:UIControlStateNormal]; ((UIButton *)[self viewWithTag:200]).frame = CGRectMake(10, 60, self.bounds.size.width-20, 40); [((UIButton *)[self viewWithTag:201]) setTitle:secondTitle forState:UIControlStateNormal]; ((UIButton *)[self viewWithTag:201]).frame = CGRectMake(10, 130, self.bounds.size.width-20, 40); [((UIButton *)[self viewWithTag:202]) removeFromSuperview]; } __block CustomAlertView * SELF = self; [UIView animateWithDuration:0.2 animations:^{ SELF.transform = CGAffineTransformScale(CGAffineTransformIdentity,0.5, 0.5); }completion:^(BOOL finished) { [UIView animateWithDuration:0.2 animations:^{ SELF.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.3, 1.3); } completion:^(BOOL finished) { [UIView animateWithDuration:0.2 animations:^{ SELF.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.0, 1.0); } completion:^(BOOL finished) { }]; }]; }]; } // 阻碍其他响应事件 self.backgroundView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; _backgroundView.backgroundColor = [UIColor blackColor]; _backgroundView.alpha = 0.3; [[UIApplication sharedApplication].keyWindow addSubview:_backgroundView]; [[UIApplication sharedApplication].keyWindow addSubview:self]; return self; } - (void)createCustomAlertView{ self.backgroundColor = [UIColor whiteColor]; self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, self.bounds.size.width, 40)]; _titleLabel.textColor = [UIColor redColor]; _titleLabel.textAlignment = NSTextAlignmentCenter; [self addSubview:_titleLabel]; // 取消按钮 self.cancelButton = [UIButton buttonWithType:UIButtonTypeCustom]; _cancelButton.frame = CGRectMake(10,AlertViewHeight - 50,self.bounds.size.width-20,40); _cancelButton.tag = 100; [_cancelButton setBackgroundImage:[UIImage imageWithColor:[UIColor colorWithRed:227.0/255.0 green:100.0/255.0 blue:83.0/255.0 alpha:1]] forState:UIControlStateNormal]; [_cancelButton addTarget:self action:@selector(didClickButtonAction:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:_cancelButton]; for (int i = 0; i < 3; i++) { UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(10, 20 +i*60, self.bounds.size.width-20, 40); button.tag = 200 + i; [button setBackgroundImage:[UIImage imageWithColor:[UIColor colorWithRed:87.0/255.0 green:135.0/255.0 blue:173.0/255.0 alpha:1]] forState:UIControlStateNormal]; [button addTarget:self action:@selector(didClickButtonAction:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:button]; } } - (void)didClickButtonAction:(UIButton *)button{ switch (button.tag) { case 100: if (_cancelBlock) { _cancelBlock(); [self dismissAlertView]; } break; case 200: if (_firstBlcok) { _firstBlcok(); [self dismissAlertView]; } break; case 201: if (_secondBlock) { _secondBlock(); [self dismissAlertView]; } break; case 202: if (_thirdBlock) { _thirdBlock(); [self dismissAlertView]; } break; default: break; } } // 取消视图 - (void)dismissAlertView{ [UIView animateWithDuration:1.0 animations:^{ self.transform = CGAffineTransformScale(CGAffineTransformIdentity,0.0, 0.0); self.alpha = 0.0; self.backgroundView.alpha = 0.0; }completion:^(BOOL finished) { self.cancelBlock = nil; self.firstBlcok = nil; self.secondBlock = nil; self.thirdBlock = nil; [_backgroundView removeFromSuperview]; [self removeFromSuperview]; _backgroundView = nil; }]; } @end @implementation UIImage (colorful) + (UIImage *)imageWithColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [color CGColor]); CGContextFillRect(context, rect); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } @end@调用
- (void)didClickButtonAction{ CustomAlertView *alertView = [[CustomAlertView alloc] initWithTitle:@"HMT" cancelButtonTitle:@"取消" firstButtonTitles:@"first" senondButtonTitles:@"second" thirdButtonTitles:@"third"]; [alertView setCancelBlock:^(){ NSLog(@"点击了取消按钮"); }]; [alertView setFirstBlcok:^(){ NSLog(@"点击了first按钮"); }]; //............以下类似 }@效果:(是不是觉得有的时候也能代替UIActionSheet)