addSubview 在 swift 中破坏动画

Posted

技术标签:

【中文标题】addSubview 在 swift 中破坏动画【英文标题】:addSubview disrupts animation in swift 【发布时间】:2016-12-29 10:05:15 【问题描述】:

调用动画的方法

    for button in self.exploreButtonsArray 
        button.exploreButtonExitAnimation()
    

    setupDrinkExploreButtons()

动画代码:

func exploreButtonExitAnimation() 
    UIView.animateWithDuration(random, delay: 0.0, options: [], animations: 
        self.center.x -= 400
        , completion: (value: Bool) in
            self.removeFromSuperview()
    )


setupDrinkExploreButtons() 方法调用.addSubview(exploreButton) 并向容器添加一些按钮。我的动画是不是因为这些动作是异步执行的而搞砸了?

第一张图片:这是任何动画之前的第一个视图

第二张图片:不调用 setupDrinkExploreButtons() 时视图的外观。所有按钮都优雅地向左移动。

第三张图片:调用 setupDrinkExploreButtons() 时的样子

在第三张图片中,您可以看到按钮没有消失,而是似乎“动画化”以适应视图。他们没有像他们应该的那样向左移动 400 个单位,而是突然向右出现 400 个单位,然后向左移动以适应其原始位置???

【问题讨论】:

您可能需要检查“随机”的值以查看它们是否在适当的范围值内。 @Dasem 动画的问题不在于速度是随机的。我已经截取了一些屏幕截图来演示问题是如何发生的。 【参考方案1】:

我最好的猜测是您在 self.exploreButtonsArray 中使用对旧视图的相同引用,或者在创建新视图时清空数组。如果你想发布你的代码,那么我可以看看。

不过,我有几点建议:

首先,这是一种不太可靠的动画制作方式。您将创建十几个动画块,根据时间的不同,它们的开始和结束时间可能略有不同。这可能会或可能不会引起注意,但这是一个坏习惯并且效率较低。为避免此问题,您可以执行以下操作:

UIView.animate(withDuration: random, delay: 0.0, options: [], animations: 
    for button in self.exploreButtonsArray 
        // BTW this is also unreliable, I would strongly suggest using definite values when animating
        button.center.x -= 400
    
, completion:  (finished) in
    for button in self.exploreButtonsArray 
        button.removeFromSuperview()
    
)

其次,如果您像这样将视图组合在一起,最好将它们全部放在一个视图中,然后为该视图设置动画。这在性能方面更有效,并且在编码时更简单。

第三,您似乎正在尝试进行一些非常简单的分页。如果您只是玩得开心并想自己实现它,那就去做吧!如果没有,您可能想使用UIPageViewController 或UICollectionViewController。我保证这意味着更少的头痛:)

【讨论】:

以上是关于addSubview 在 swift 中破坏动画的主要内容,如果未能解决你的问题,请参考以下文章

Monotouch addsubview 动画

Swift4滚动UITableview后,动画UITableview框架是错误的

swift 使 UIImageView 和 UIView 像一层一样使它们一起动画

Swift:addSubview 后背景消失

swift 2.0中navigationController中nib的AddSubview(为啥这么难?)

Swift:addSubview 放在前一个视图上