IOS自带的UIAlertView很多时候并不能满足我们项目的UI需求,这时候就需要自定义UIAlertView。
下面是用delegate(不懂IOS delegate的同学可以百度下)自定义的一个UIAlertView,继承自UIView,取名为CustomeAlert;
首先需要添加CustomeAlert的UI,我这里是用一个xib文件(如下图),这里有两部分,一是设置一定透明度的背景,另外就是弹出框的内容,我设置的偏宽就是为了后面弹出框的动画做准备。
接下来在CustomeAlert.h里面添加代理,这里定义了一个代理方法,就是alertView的点击的button,0取消1确定
@protocol CustomeAlertDelegate <NSObject> @optional - (void)alertButtonClicked:(NSInteger) buttonIndex; @end
并且添加delegate这个属性
@property (nonatomic,assign) id<CustomeAlertDelegate> delegate;
然后在.m初始化CustomeAlert,这里需要注意我是xib加载的,所以是作为其子类,如果直接self = [[[NSBundlemainBundle]loadNibNamed:@"customeAlert"owner:selfoptions:nil]lastObject]则设置delegate和点击事件都会crash,如果用代码不是直接拖拽控件来生成上面的UI则可以直接等于,不需要作为其子类添加(个人见解,没有验证,有兴趣的同学可以去测试验证下)。
- (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if(self){ UIView *view = [[[NSBundle mainBundle]loadNibNamed:@"customeAlert" owner:self options:nil]lastObject]; <u><em>[self addSubview:view];</em></u> } self.backgroundColor = [UIColor clearColor]; //设置弹出框的样式和动画 [self alertViewShow]; return self; }
//设置alertView的样式和动画 - (void)alertViewShow{ //设置圆角 self.alertContentView.layer.masksToBounds = YES; self.alertContentView.layer.cornerRadius = 8.0; //动画 [UIView animateWithDuration:0.3 animations:^{ self.alertContentView.transform = CGAffineTransformScale(self.alertContentView.transform, 0.9, 0.9); }]; }
接下来是button事件,点击button同时要移除此类 用removeFromSuperview。
//按下取消按钮 - (IBAction)pressedCancelButton:(UIButton *)sender { if([_delegate respondsToSelector:@selector(alertButtonClicked:)]){ [_delegate alertButtonClicked:0]; } [self removeFromSuperview]; } //按下了确定键 - (IBAction)pressedEnsureButton:(UIButton *)sender { if([_delegate respondsToSelector:@selector(alertButtonClicked:)]){ [_delegate alertButtonClicked:1]; } [self removeFromSuperview]; }
这样就差不多做好了CustomeAlert了,然后就是ViewController应用自定义的alertView了。
在引入头文件和声明代理@interface ViewController () <CustomeAlertDelegate>后就可以了
//弹出自定义的alertView - (IBAction)customeAlertView:(UIButton *)sender { customeAlert *alert = [[customeAlert alloc] initWithFrame:self.view.frame]; alert.delegate = self; [self.view addSubview:alert]; }
#pragma mark- 代理 - (void)alertButtonClicked:(NSInteger)buttonIndex{ if(buttonIndex == 0){ NSLog(@"您按下了取消键"); } if(buttonIndex == 1){ NSLog(@"您按下了确定键"); } }
截图效果