我有 vc1.view 覆盖整个屏幕,我希望能够使 vc1.view 变暗,并让 vc2.view 放大整个屏幕。
我的应用程序中没有任何导航控制器,那么实现我的目标的最佳做法是什么?我正在考虑的解决方案是:
- 将 vc1.view 和 vc2.view 添加到公共容器视图中
- 使用【UIView transitionFromView:vc1.view toView:vc2.view ......】
我不喜欢必须将不同 vc 的视图添加到公共容器视图中的想法。有什么建议么?提前致谢。
我有 vc1.view 覆盖整个屏幕,我希望能够使 vc1.view 变暗,并让 vc2.view 放大整个屏幕。
我的应用程序中没有任何导航控制器,那么实现我的目标的最佳做法是什么?我正在考虑的解决方案是:
我不喜欢必须将不同 vc 的视图添加到公共容器视图中的想法。有什么建议么?提前致谢。
您可以使用 transitionFromView:toView:... 而不将新视图添加到公共容器,因为该转换方法负责添加视图。以下对我有用。代码位于视图控制器中,其视图是“来自视图”。我在这里使用交叉淡入淡出,但您可以将其更改为任何其他可用方法:
-(void)switchViews:(id)sender {
UIWindow *win = self.view.window;
YellowController *yellow = [self.storyboard instantiateViewControllerWithIdentifier:@"Yellow"];
yellow.view.frame = self.view.frame;
[UIView transitionFromView:self.view toView:yellow.view duration:2 options:UIViewAnimationOptionTransitionCrossDissolve completion:^(BOOL finished) {
win.rootViewController = yellow;
}];
}
但是,要进行自定义转换,您必须将新视图添加为“来自视图”所在的任何视图的子视图(我认为)。在这个例子中,这是窗口的视图。此代码从旧视图的中心生成新视图,而该视图淡出。在转换结束时,视图控制器切换到拥有新视图的控制器(在这种情况下为黄色)
编辑后:我将此方法更改为使用 CGAffineTransform (感谢 jrturton 在回答我的问题时提出的建议):
-(void)switchViews3:(id)sender {
UIWindow *win = self.view.window;
YellowController *yellow = [self.storyboard instantiateViewControllerWithIdentifier:@"Yellow"];
yellow.view.frame = self.view.frame;
yellow.view.transform = CGAffineTransformMakeScale(.1, .1);
[win addSubview:yellow.view];
[UIView animateWithDuration:.6 animations:^{
yellow.view.transform = CGAffineTransformIdentity;
self.view.alpha = 0;
}
completion:^(BOOL finished) {
[self.view removeFromSuperview];
win.rootViewController = yellow;
}];
}
要在没有导航控制器的情况下从 vc1 呈现到 vc2,请使用
[vc1 presentViewController:vc2 animated:YES completion:nil];
为了改变呈现风格,Apple 提供了一些。您只需要在调用上述代码之前进行设置:
vc2.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
这是列表:
typedef enum {
UIModalTransitionStyleCoverVertical = 0,
UIModalTransitionStyleFlipHorizontal,
UIModalTransitionStyleCrossDissolve,
UIModalTransitionStylePartialCurl,
} UIModalTransitionStyle;