现在的位置: 首页 > 综合 > 正文

使用delegate自定义UIAlertView

2018年08月04日 ⁄ 综合 ⁄ 共 2149字 ⁄ 字号 评论关闭

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(@"您按下了确定键");
    }
}

截图效果

抱歉!评论已关闭.