【问题标题】:Swift: removeFromSubview happens before animationSwift:removeFromSubview 发生在动画之前
【发布时间】:2014-12-13 22:22:48
【问题描述】:

我有一个小的设置,我有一个 MPMoviePlayerController 设置作为视频背景。我试图让它在更新/更改时平稳过渡。这是我当前的代码。顺便说一句,newBackground.view.alpha 最初是 0。

let oldBackground = currentBackground

self.view.insertSubview(newBackground.view, aboveSubview: oldBackground.view)
  UIView.animateWithDuration(1.5 as NSTimeInterval, animations: {
    newBackground.view.alpha = 1
    }, completion: {
      finished in
      oldBackground.view.removeFromSuperview()
      println("The subview should be removed now")
  })

执行此操作时,oldBackground.view 会在 newBackground 开始淡入之前立即被删除。然而,println 发生在动画完成后。我不明白为什么 removeFromSuperview 会立即发生,但 println 会在我期望的时候发生。如果我删除 oldBackground.view.removeFromSuperview(),动画会淡入并看起来很好(但视图显然没有被删除,它只是坐在 newBackground 后面)。

编辑:奇怪的是,它似乎在模拟器中按预期工作。在我的 iPhone 6 Plus 上运行每次都会给我带来问题。我已经从 Xcode 卸载并重新运行它,但问题仍然存在。

如果有人对我有任何建议,我会很高兴。谢谢。

【问题讨论】:

  • 这么长的镜头,我只想在评论中说:旧视频还在播放还是在过渡时就结束了?您是否使用相同的电影播放器​​控制器实例?您是要淡出还是将旧版本的 alpha 设置为 0?
  • 这可能与iOS 8.1.2有关吗?在两个不同的物理 iPhone(iOS 8.1.2 上的 6 和 6 Plus)上进行测试会导致问题,但它在模拟器设备 (8.1) 上运行良好。

标签: ios animation swift jquery-animate


【解决方案1】:

我猜当newBackground.view.alpha = 1 在动画期间执行时,它会将背景带入可见性并覆盖oldBackground。

【讨论】:

  • 附录:在completion 检查布尔值是否真的在最后。在真正的终结之前,它可能会被调用为 false。
  • Thomas Kilian:即使我检查布尔值(甚至检查以确保 alpha 位于动画结束时的位置),它仍然会立即执行。该 println 仅在动画完成后发生一次,但 removeFromSuperview 立即发生。您是否看到了有关在模拟器中正常工作的一些信息?
  • 这只是一个猜测。抱歉,它没有帮助。也许还有其他的接受者。
  • 感谢您的意见。
【解决方案2】:

当您将新子视图放在旧子视图上方时,旧子视图会退到后面。这发生在动画代码开始之前。在插入之前确保新子视图的 alpha 为 0。如果你想要一个淡出动画,你应该将你的 oldBackground alpha 设置为 0。

像这样:

let oldBackground = currentBackground

newBackground.view.alpha = 0

self.view.insertSubview(newBackground.view, aboveSubview: oldBackground.view)
  UIView.animateWithDuration(1.5 as NSTimeInterval, animations: {
    newBackground.view.alpha = 1
    oldBackground.view.alpha = 0
    }, completion: {
      finished in
      oldBackground.view.removeFromSuperview()
      println("The subview should be removed now")
  })

【讨论】:

  • 我在原始问题中提到“newBackground.view.alpha 最初为 0”。我当前的设置应该是在 oldBackground 前面添加一个透明的 newBackground。 newBackground 动画为 alpha = 1(因此完全隐藏 oldBackground,让它干净地消失)。这在模拟器中完美运行,但在我的 iPhone 6 Plus 上闪烁黑色。还有其他想法吗?
  • 您尝试更改时间间隔吗?我会尝试不同的时间,看看它是否会影响任何事情。
  • 澄清一下:在我的情况下,“闪烁黑色”意味着 oldBackground.view 在动画之前被删除,露出我的黑色主视图。
  • H. Serdar:时间间隔似乎没有什么区别。视图立即被移除,然后在动画完成后发生 println。
  • 我刚刚明白了这个问题。我以为它直接显示了新视图。我现在没有任何想法,但如果我想到什么我会再写一次。
猜你喜欢
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多