自定义弹出框alertView的一些思路

(一)第一部分

先来解释UIView的几个函数:

(1)- (void)didAddSubview:(UIView *)subview;

UIView每addSubview一次,就会执行上述的回调函数。

(2)- (void)willMoveToSuperview:(UIView *)newSuperview

UIView的Superview发生变化时执行此函数;newSuperview可以是nil(我调试过,当UIView被removeFromSuperview,newSuperview为nil)。


(二)第二部分

然而,我们在创建自定义alertView的时候,主要是分两个部分的view:backgroundView(一般是半透明、黑色)、selfView(显示alert内容的view,最主要的部分,包括提示的文字描述、按钮及其执行的action)。

(1)所以,可以在[[UIApplication sharedApplication].keyWindow addSubview:self];执行回调- (void)willMoveToSuperview:(UIView *)newSuperview的函数内先AddSubview(backgroundView,执行[[UIApplication sharedApplication].keyWindow addSubview:self.backgroundView]); 还可以加上self的动画如,

//add UIView执行的动画效果
self.transform = CGAffineTransformMakeRotation(-M_1_PI / 2);
    CGRect afterFrame = CGRectMake((CGRectGetWidth(topVC.view.bounds) - kAlertWidth) * 0.5, (CGRectGetHeight(topVC.view.bounds) - kAlertHeight) * 0.5, kAlertWidth, kAlertHeight);
    [UIView animateWithDuration:0.35f delay:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{
        self.transform = CGAffineTransformMakeRotation(0);
        self.frame = afterFrame;
    } completion:^(BOOL finished) {
    }];


(2)定义button的action,你可以用block回调、也可以使用delegate委托。

//执行button的action操作,并移除view
- (void)leftBtnClicked:(id)sender
{
    _leftLeave = YES;
    [self dismissAlert];
    if (self.leftBlock) {
        self.leftBlock();
    }
}
- (void)rightBtnClicked:(id)sender
{
    _leftLeave = NO;
    [self dismissAlert];
    if (self.rightBlock) {
        self.rightBlock();
    }
}

这个是执行一些业务流程的操作的部分。


(3)最后重写- (void)removeFromSuperview,移除UIView,执行操作(移除view时加动画或者是执行业务规则等等)。

//remove UIView执行的动画效果
CGRect afterFrame = CGRectMake((CGRectGetWidth(topVC.view.bounds) - kAlertWidth) * 0.5, CGRectGetHeight(topVC.view.bounds), kAlertWidth, kAlertHeight);
    
    [UIView animateWithDuration:0.35f delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        self.frame = afterFrame;
        if (_leftLeave) {
            self.transform = CGAffineTransformMakeRotation(-M_1_PI / 1.5);
        }else {
            self.transform = CGAffineTransformMakeRotation(M_1_PI / 1.5);
        }
    } completion:^(BOOL finished) {
        
        [super removeFromSuperview];
    }];


附:不管是addSubview或者是removeFromSuperview都会执行回调- (void)willMoveToSuperview:(UIView *)newSuperview,所以要做区别判断(是否nil)。

你可能感兴趣的:(自定义,AlertView)