我有vc1.view覆盖整个屏幕,我希望能够调暗vc1.view,并让vc2.view放大到整个屏幕。
我的应用程序中没有任何导航控制器,那么实现目标的最佳做法是什么?我想到的解决方案是:
我不喜欢必须将不同vc的视图添加到公共容器视图中。有什么建议?提前谢谢。
答案 0 :(得分:2)
您可以使用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;
}];
}
答案 1 :(得分:1)
要在没有导航控制器的情况下从vc1呈现到vc2,请使用
[vc1 presentViewController:vc2 animated:YES completion:nil];
为了改变呈现风格,Apple提供了一些。你只需要在调用上面的代码之前设置它:
vc2.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
以下是清单:
typedef enum {
UIModalTransitionStyleCoverVertical = 0,
UIModalTransitionStyleFlipHorizontal,
UIModalTransitionStyleCrossDissolve,
UIModalTransitionStylePartialCurl,
} UIModalTransitionStyle;