0

我正在构建一个应用程序,其中第一个视图有一个菜单面板,我希望这个面板在应用程序的生命周期内一直存在。用户可以“去”的唯一地方是通过这个面板上的按钮(一个 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];
    }];
}
4

1 回答 1

0

结果是一个简单的错误——我需要在调用 addSubview 之前设置destinationVC 的框架。之后设置它会触发不需要的动画。

于 2013-02-13T17:08:21.253 回答