在 UIView.animateWithDuration 之前完全取消隐藏视图

Completely unhide view prior to UIView.animateWithDuration

我正在使用 UIView.animateWithDuration 在点击识别时在视图中滑动。这工作正常,除了第一次,视图未隐藏稍微晚一点,它突然出现在动画的中途。随后的 show/hide 操作没有这个问题。

我按如下方式实现

    textBlurBackground.hidden = false
    descriptionOutlet.hidden = false
    UIView.animateWithDuration(0.4, delay: 0.0, options: nil, animations: {
        self.textBlurBackground.transform = CGAffineTransformMakeTranslation(0, 0)
        self.descriptionOutlet.transform = CGAffineTransformMakeTranslation(0, 0)
        }, completion: nil)

所以看起来,即使我首先设置 "hidden" 属性(在前两行),这也会以某种方式延迟并且仅在动画已经 [=26] 时执行=].请注意,这只会在第一次创建视图时发生;随后的 show/hide 操作工作正常(视图在动画之前完全不隐藏)。

我注意到有一个 "completion" 挂钩 - 准备阶段是否有等效的东西? IE。在视图完全取消隐藏之前不要启动动画。

视图可能需要几毫秒才能首次出现,因为它必须 rendered/drawn 在屏幕上,主要是在该视图包含大量子视图的情况下。您是否在同一个 handleTap 函数中实例化该视图?您应该在 UIViewController 的 viewDidLoad 方法或 UIView 的 init 方法中实例化视图。在实例化视图后立即设置隐藏需要隐藏的内容。接下来,在 handleTap 中,取消隐藏它们并执行上面发布的动画。

感谢评论中的时间建议(和 运行 事情慢慢来)我可以弄清楚,在这种情况下,这不是时间问题,而是视图的维度在某种程度上是首次加载视图时不正确。例如。我在 viewDidLoad

override func viewDidLoad() {
    textBlurBackground.hidden = true
    descriptionOutlet.hidden = true
    descriptionOutlet.transform = CGAffineTransformMakeTranslation(-textBlurBackground.bounds.width, 0)
    textBlurBackground.transform = CGAffineTransformMakeTranslation(-textBlurBackground.bounds.width, 0)
}

textBlurBackground.bounds.width 在这一点上是不正确的;该代码不会通过 textBlueBackground 视图的负宽度将这些视图完全移出屏幕。但是,加载视图后,后续 show/hide 操作会正常工作,因为它可以获得正确的视图大小。

因此这似乎是自动布局大小调整的问题,其中 "textBlurBackground.bounds.width" 在初始视图加载时不正确。这很奇怪,因为它不会改变大小,所以我可能需要指定更多约束。