我正在构建一个应用程序,其中第一个视图有一个菜单面板,我希望这个面板能够在应用程序的生命周期中保持不变。用户可以“前往”的唯一位置可通过此面板上的按钮(UICollectionView)访问。如果它很重要,这个应用程序仅限风景,仅限iOS 6。
为了完成这项工作,我创建了一个自定义segue,它从视图中删除除菜单面板之外的所有内容,然后将新视图控制器的视图添加为子视图,将新视图的框架设置为superview的边界,并将新视图发送到后面(因此它位于菜单面板后面)。我从prepareForSegue调用viewWill / DidDisappear,否则它们不会被调用。
它可能听起来像kludgy(它对我来说),但它工作正常除了一件事 - 新视图从底部出现。看起来很有趣。
然后我尝试添加自己的动画块 - 我最初将视图定位到左侧,然后将其设置为动画。我将它发送到动画完成块的后面。这似乎是完全合乎逻辑的,帧值是他们应该的。但这个更糟糕 - 视图来自左下角。
有人可以建议一种方法来完成这项工作吗?这是我目前的执行方法:
- (void)perform {
MainMenuViewController *sourceVC = (MainMenuViewController *)self.sourceViewController;
UIViewController *destinationVC = (UIViewController *)self.destinationViewController;
for (UIView *subview in [sourceVC.mainView subviews]) {
// don't remove the menu panel or the tab
if (![subview isKindOfClass:[UICollectionView class]] && [subview.gestureRecognizers count] == 0) {
[subview removeFromSuperview];
}
}
[sourceVC.mainView addSubview:destinationVC.view];
CGRect finalFrame = sourceVC.mainView.bounds;
CGRect frame = finalFrame;
frame.origin.x = finalFrame.origin.x - finalFrame.size.width;
destinationVC.view.frame = frame;
[UIView animateWithDuration:0.5 animations:^{
destinationVC.view.frame = finalFrame;
} completion:^(BOOL finished) {
// make sure it ends up behind the main menu panel
[sourceVC.mainView sendSubviewToBack:destinationVC.view];
}];
}
答案 0 :(得分:0)
原来这是一个简单的错误 - 我需要在调用addSubview之前设置destinationVC的帧。之后设置它会触发不需要的动画。