为啥自定义缩放和翻转动画后视图会在任务栏下绘制?

Posted

技术标签:

【中文标题】为啥自定义缩放和翻转动画后视图会在任务栏下绘制?【英文标题】:Why does view draw under the task bar after a custom scale and flip animation?为什么自定义缩放和翻转动画后视图会在任务栏下绘制? 【发布时间】:2012-05-24 04:37:31 【问题描述】:

与previous question 中的代码相同,但问题不同。

我创建了一个自定义动画来将视图控制器添加到 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: 块,它不会在任务栏下绘制(尽管随后视图似乎会翻转到自身,然后突然显示新视图,当然)。

【问题讨论】:

缩回原尺寸时,只需设置self.view.transform = CGAffineTransformIdentity;。恒等变换始终未缩放且未旋转。 谢谢。试过了,没什么区别。 另外,正如 danyowdee 在您之前的问题中所问的那样:“您不能只使用 presentViewController:animated:completion: 将其转换样式设置为 UIModalTransitionStyleFlipHorizontal 吗?” 是的,但它不会是我的设计师伙伴设计的自定义动画,这很酷,你知道吗? @DavidRönnqvist 哦,还因为 UIModalTransitionStyleFlipHorizo​​ntal 用于模态转换。这是一个 UINavigationController 推送。 【参考方案1】:

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

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

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

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

注意:layoutsubview、setNeedsLayout 不起作用。

【讨论】:

不错!我不得不放弃这个代码路径,但我最终会回到它,并希望你的解决方案有效!我敢打赌它确实如此(这很有意义!),所以会接受它。

以上是关于为啥自定义缩放和翻转动画后视图会在任务栏下绘制?的主要内容,如果未能解决你的问题,请参考以下文章

来自 XIB 的自定义 UIView 加载具有巨大规模的子视图

在自定义绘制的视图中动画大小变化的问题

使用 CGAffineTransformScale 自定义 UIView 缩放

你如何动画滚动和原子缩放?

Android自定义View(9) 《动画 插值器简介》

iPhone:在导航栏下隐藏自定义视图