iu | 图片来源于网络
传统自定义转场是在两个代理方法UIViewControllerTransitioningDelegate和UINavigationControllerDelegate中做处理,网上此类分享很多,我今天分享另一种思路。
效果如下:
效果.gif
思路:
关掉转场动画
转场之前,先将一个自定义view覆盖在[[[[UIApplication sharedApplication] delegate] window]上,再执行转场,但是此时用户看不到转场(实际上已经转场),只能看到这个最顶层的view,你想做什么动画就在这个view上做,做完之后将这个view移除即可。
关键就是在转场前用一个view覆盖在window之上。
DEMO及代码:
demo效果:
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