我正在构建一个应用程序,其中第一个视图有一个菜单面板,我希望这个面板在应用程序的生命周期内一直存在。用户可以“去”的唯一地方是通过这个面板上的按钮(一个 UICollectionView)。万一这很重要,这个应用程序仅限横向,并且仅限 iOS 6。
为了完成这项工作,我创建了一个自定义 segue,它从视图中删除了除菜单面板之外的所有内容,然后将新视图控制器的视图添加为子视图,将新视图的框架设置为超级视图的边界,然后发送背面的新视图(因此它位于菜单面板的后面)。我从 prepareForSegue 调用 viewWill/DidDisappear,因为否则它们不会被调用。
这听起来可能很笨拙(对我来说确实如此),但它工作正常,除了一件事 - 新视图从底部出现。看起来很有趣。
然后我尝试添加我自己的动画块 - 我最初将视图定位在左侧,然后将其设置为动画。我将它发送到动画完成块的后面。这似乎完全合乎逻辑,并且帧值都是它们应该的值。但这个更糟糕 - 视图来自左下角。
任何人都可以提出一种方法来完成这项工作吗?这是我当前的执行方法:
- (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];
}];
}