美文网首页
关于iOS App中自定义警告Alert类的弹窗的使用

关于iOS App中自定义警告Alert类的弹窗的使用

作者: dragonYao | 来源:发表于2016-12-21 11:31 被阅读1807次
    最近项目不是很紧,把以前遇到的弹窗类的问题总结一下,以避免以后复习查看。(前面文字说明很长,看文章的可以跳过)

    一般项目中使用的警告类弹窗是系统自带的UIAlertView 或者UIAlertController就能满足需求,但是其样式是固定的,修改起来比较的有局限性,但是设计师又不想使用这种系统的样式,那我们就只能按照设计师的要求去自定义Alert,那么问题就来了。o(╯□╰)o

    问题
    • 如果涉及到网络,我们自定义的弹窗能满足项目的需要,往往也会伴随着Crash(具体情况下面说),安全这一块没有系统的Alert处理的好(大牛写的除外)
    • 我们自定义的Alert没有很大的可扩展性,仅仅能满足自己的项目需要
    • 打个广告我使用的可扩展比较强,非常好用Alert的应该属 CustomIOSAlertView ,可以根据项目的需要进行自定义View,但是这依旧不能满足我们的设计师的眼光。😔
    还是乖乖的自定义Alert吧

    上面说到了涉及到网络Crash的情况是这样的,我们自定义的Alert需要在一个页面的网络请求返回后弹出,这个时候我们Push或者Pressent到了另一个页面,刚好上个页面的请求返回了,就会出现在我们当前的页面,点击上面的按钮,Crash!!!

    如何改进?
    • 使用单利,就算在其他的页面弹出,起码不会造成崩溃
    • block回调(这种方法不适合我目前的项目)
    • 让自定义的Alert只在显示的页面出现,(需要传进去当前Controller)
    这里我就用单利写一个简单的Alert(Frame和按钮的个数 我就写死了)O(∩_∩)O哈哈~ 尴尬😁
    • .h中方法声明
    @interface CTTAlertView : UIView
    +(id)shareInstance;
    -(void)showViewAtViewController:(UIViewController *)controller
                         withMessage:(NSString *)message
                          withCancel:(NSString *)cancel
                         withConfirm:(NSString *)confirm;
    @end
    
    • .m中实现
    #import "CTTAlertView.h"
    #define kAlertViewH 148.0
    #define kAlertViewW 300.0
    #define kMargin 10.0
    #define kBtnW 100.0
    #define kBtnH 22.0
    #define kLeftMargin 16.0
    #define kBottomMargin 13.0
    @interface CTTAlertView ()
    @property (nonatomic, strong) UIImageView *imgView;
    @property (nonatomic, strong) UIView *separatorView;
    @property (nonatomic, strong) UIView *alertView;
    @property (nonatomic, strong) UILabel *msgLabel;
    @property (nonatomic, strong) UIButton *cancelBtn;
    @property (nonatomic, strong) UIButton *confirmBtn;
    @end
    @implementation CTTAlertView
    +(id)shareInstance {
        static dispatch_once_t onceToken;
        static CTTAlertView *instance = nil;
        dispatch_once(&onceToken, ^{
            instance = [[CTTAlertView alloc] init];
        });
        return instance;
    }
    -(instancetype)init {
        self = [super init];
        if (self) {
            [self setupViews];
        }
        return self;
    }
    -(instancetype)initWithFrame:(CGRect)frame {
        self = [super initWithFrame:frame];
        if (self) {
            [self setupViews];
        }
        return self;
    }
    -(void)setupViews {
        self.frame = CGRectMake(0, 0, KWIDTH, KHEIGHT);
        self.backgroundColor = RGBACOLOR(0, 0, 0, .5);
        //background image view
        self.imgView = [[UIImageView alloc] initWithFrame:CGRectMake((KWIDTH - kAlertViewW) / 2.0, (KHEIGHT - kAlertViewH - 64.0) / 2.0, kAlertViewW, kAlertViewH)];
        self.imgView.userInteractionEnabled = YES;
        self.imgView.contentMode = UIViewContentModeScaleAspectFill;
        self.imgView.image = [UIImage imageNamed:@"pop_alert_icon"];
        [self addSubview:self.imgView];
        //view
        self.alertView = [[UIView alloc] initWithFrame:CGRectMake(self.imgView.frame.origin.x + kMargin, self.imgView.frame.origin.y + kMargin, (kAlertViewW - kMargin * 2), (kAlertViewH - kMargin * 2))];
        self.alertView.backgroundColor = [UIColor whiteColor];
        self.alertView.layer.cornerRadius = 2.0;
        self.alertView.layer.masksToBounds = YES;
        [self addSubview:self.alertView];
        //cancel  button
        CGFloat yOffset = self.alertView.frame.size.height - kBottomMargin - kBtnH;
        UIButton *cancelBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        cancelBtn.frame = CGRectMake(kLeftMargin, yOffset, kBtnW, kBtnH);
        [cancelBtn setTitleColor:kColor(153, 153, 153, 1)
                        forState:UIControlStateNormal];
        cancelBtn.titleLabel.font = [Yi23Utils pingFangSCLightFont:14];
        [cancelBtn addTarget:self
                      action:@selector(cancelBtnAction:)
            forControlEvents:UIControlEventTouchUpInside];
        [self.alertView addSubview:cancelBtn];
        self.cancelBtn = cancelBtn;
        //confirm button
        CGFloat xOffset = self.alertView.frame.size.width - kLeftMargin - kBtnW;
        UIButton *confirmBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        confirmBtn.frame = CGRectMake(xOffset, yOffset, kBtnW, kBtnH);
        [confirmBtn setTitleColor:KKhaki
                         forState:UIControlStateNormal];
        confirmBtn.titleLabel.font = [Yi23Utils pingFangSCLightFont:14];
        [confirmBtn addTarget:self
                       action:@selector(confirmBtnAction:)
             forControlEvents:UIControlEventTouchUpInside];
        [self.alertView addSubview:confirmBtn];
        self.confirmBtn = confirmBtn;
        //separator line
        UIView *separatorView = [[UIView alloc] initWithFrame:CGRectMake((self.alertView.frame.size.width - 1.0) / 2.0, self.alertView.frame.size.height - 17.0 - 15.0, 1.0, 17.0)];
        separatorView.backgroundColor = kColor(0, 0, 0, 0.1);
        [self.alertView addSubview:separatorView];
        //message label
        CGFloat labelW = self.alertView.frame.size.width - 8 * 2;
        self.msgLabel = [[UILabel alloc] initWithFrame:CGRectMake(8, 8, labelW, 74.0)];
        self.msgLabel.font = [UIFont systemFontOfSize:14];
        self.msgLabel.textAlignment = NSTextAlignmentCenter;
        self.msgLabel.textColor = [UIColor blackColor];
        self.msgLabel.numberOfLines = 0;
        self.msgLabel.lineBreakMode = NSLineBreakByWordWrapping;
        self.msgLabel.preferredMaxLayoutWidth = labelW;
        [self.alertView addSubview:self.msgLabel];
    }
    -(void)showViewAtViewController:(UIViewController *)controller
                         withMessage:(NSString *)message
                          withCancel:(NSString *)cancel
                         withConfirm:(NSString *)confirm
    {
        UIView *bgView = (UIView *)controller.view;
        [bgView addSubview:self];
    
        [self.cancelBtn setTitle:cancel
                        forState:UIControlStateNormal];
        [self.confirmBtn setTitle:confirm
                         forState:UIControlStateNormal];
        self.msgLabel.text = (message == nil) ? @" " : message;
    }
    -(void)removeAlertViewFromSupview {
        [self removeFromSuperview];
    }
    #pragma mark - ButtonAction
    -(void)cancelBtnAction:(UIButton *)sender {
        [self removeFromSuperview];
    }
    -(void)confirmBtnAction:(UIButton *)sender {
        [self removeFromSuperview];
    }
    @end
    
    记录一下这个点,方便以后查看,如有代码有什么不妥,请留言多多指教。😀🙏

    相关文章

      网友评论

          本文标题:关于iOS App中自定义警告Alert类的弹窗的使用

          本文链接:https://www.haomeiwen.com/subject/cwqqvttx.html