转载

iOS | 自定义转场的另一种思路

iOS | 自定义转场的另一种思路

iu | 图片来源于网络

传统自定义转场是在两个代理方法UIViewControllerTransitioningDelegate和UINavigationControllerDelegate中做处理,网上此类分享很多,我今天分享另一种思路。

效果如下:

iOS | 自定义转场的另一种思路

效果.gif

思路:

  1. 关掉转场动画

  2. 转场之前,先将一个自定义view覆盖在[[[[UIApplication sharedApplication] delegate] window]上,再执行转场,但是此时用户看不到转场(实际上已经转场),只能看到这个最顶层的view,你想做什么动画就在这个view上做,做完之后将这个view移除即可。

关键就是在转场前用一个view覆盖在window之上。

DEMO及代码:

demo效果:

iOS | 自定义转场的另一种思路

demo效果.gif

代码:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {    
        // 在window上覆盖一个白色view
    UIView *whiteView = [[UIView alloc] initWithFrame:self.view.bounds];
    whiteView.backgroundColor = [UIColor whiteColor];
    [[[[UIApplication sharedApplication] delegate] window] addSubview:whiteView];    
    
    // 图片
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"phone"]];
    imageView.frame = CGRectMake(0, 300, self.view.frame.size.width, self.view.frame.size.width/2.2);
    [whiteView addSubview:imageView];    
    
    // 暗中转场
    SecondViewController *secondVC = [[SecondViewController alloc] init];
    [self.navigationController pushViewController:secondVC animated:NO];    
    
    // 动画
    [UIView animateWithDuration:0.3 animations:^{
        imageView.frame = CGRectMake(0, 90, self.view.frame.size.width, self.view.frame.size.width/2.2);
    } completion:^(BOOL finished) {        
            // 动画结束后移除view
        [whiteView removeFromSuperview];
    }];
}

作者:无夜之星辰
链接:https://www.jianshu.com/p/3fb382cf2583

正文到此结束
Loading...