1

与上一个问题中的代码相同,但问题不同。

我创建了一个自定义动画来将视图控制器添加到 UINavigationController。此代码将视图缩放到原始大小的 80%,然后翻转它,然后将其缩放回原始大小:

[UIView animateWithDuration:scaleDuration delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
    // Scale the controllers' views down.
    self.view.transform = CGAffineTransformScale(self.view.transform, 0.8, 0.8);
} completion:^(BOOL finished) {
    // Transition to the new view and push on the new view controller.
    [UIView transitionWithView:self.view duration:1 options:UIViewAnimationOptionCurveLinear | UIViewAnimationOptionTransitionFlipFromLeft animations:^{
        [self pushViewController:viewController animated:NO];
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:scaleDuration delay:0 options:UIViewAnimationOptionCurveLinear animations:
^{
            // Scale back to the original size.
            self.view.transform = CGAffineTransformScale(self.view.transform, 1.25, 1.25);
        } completion:nil];
    }];
}];

问题是,当动画完成时,新视图显示得非常好,除了它是在任务栏下绘制的。也就是说,它在屏幕原点 0,0 而不是 0,20 处绘制。“状态栏”选项在 IB 中设置(设置为“黑色”),如果我使用标准 UINavigationController 推送动画,自然不会发生这种情况,只有我的自定义动画。如果我在动画后旋转设备,旋转时重绘会将其移动到正确的位置。但我如何让它首先做到这一点?

pushViewController:animated:作为一个额外的皱纹,如果我将调用线向下移动到块,它不会在任务栏下绘制completion:(尽管随后视图似乎会翻转到自身,然后突然显示新视图,当然)。

4

1 回答 1

0

我发现到目前为止唯一的解决方法是隐藏导航栏然后显示它。

设置转换后,添加以下 2 行:

[self setNavigationBarHidden:YES];
[self setNavigationBarHidden:NO];

它很丑但有效,我也在寻找更好的解决方案。

注意:layoutsubview、setNeedsLayout 不起作用。

于 2012-09-26T07:31:06.443 回答