我一直在尝试创建一个模仿“Cover Vertical”模态segue的UIStoryboardSegue,但是使视图“Uncover”,以便segues看起来自然。这是我的UIStoryboardSegue子类:
//RetreatVertical.m
#import "RetreatVertical.h"
@implementation RetreatVertical
-(void)perform {
UIView *oldView = [self.sourceViewController view];
UIView *newView = [self.destinationViewController view];
[oldView.window insertSubview:newView belowSubview:oldView];
[UIView animateWithDuration:0.3 animations:^{
oldView.center = CGPointMake(oldView.center.x, oldView.center.y + oldView.frame.size.height); }
completion:^(BOOL finished){ [oldView removeFromSuperview]; }
];
}
@end
当用户点击按钮时,UIViewController使用模态segue“Cover Vertical”滑动到焦点。当用户点击新UIViewController上的按钮时,该UIViewController向下滑动,显示旧的UIViewController(使用我的自定义segue“RetreatVertical”)。这一切都运行正常,但是,每当我在两个动画完成后点击任何其他按钮或界面元素时,应用程序都会以“EXC_BAD_ACCESS”崩溃。我不明白为什么,过去一小时的搜索没有提出任何建议。
谢谢!
修改 为什么这个策略不起作用?
- (void) perform {
UIView *sourceView = [self.sourceViewController view];
UIView *destView = [self.destinationViewController view];
[[self.sourceViewController superview] insertSubview:destView belowSubview:sourceView];
[UIView animateWithDuration:0.3 animations:^{
sourceView.center = CGPointMake(sourceView.center.x, sourceView.center.y + sourceView.frame.size.height); }
completion:^(BOOL finished){ [sourceView removeFromSuperview]; }
];
}
答案 0 :(得分:2)
直接使用应用程序窗口(以及它的子视图)总是很棘手,很难做到正确;有很多隐藏的东西正在发生,你可能无法解释。因此,我们只需稍微更改您的层次结构,以使一切变得更轻松。
现在你有:
A =根VC
B =新VC
转换:窗口 { A -----> B }
更好的解决方案:
A =根VC
B =新VC
C =旧VC
转换:窗口{ A { C -----> B }}
这意味着您的Root只是一个普通的VC,其空白视图会将您的视图推到顶部。这样您就可以轻松完成所需的任何动画,而无需担心搞砸主窗口。