自定义segue,从左到右的动画转向对角线

时间:2013-02-13 00:17:29

标签: ios6 uiviewanimation uistoryboardsegue

我正在构建一个应用程序,其中第一个视图有一个菜单面板,我希望这个面板能够在应用程序的生命周期中保持不变。用户可以“前往”的唯一位置可通过此面板上的按钮(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];
    }];
}

1 个答案:

答案 0 :(得分:0)

原来这是一个简单的错误 - 我需要在调用addSubview之前设置destinationVC的帧。之后设置它会触发不需要的动画。