【问题标题】:Animating UIView isHidden subviews动画 UIView isHidden 子视图
【发布时间】:2017-05-26 09:48:47
【问题描述】:

我有一个 UIView EmptyCollectionView,当我的 UICollectionView 为空时显示。我的工作方式是在 ViewController 的 viewDidLoad 中创建 UIView 和 addSubview,然后根据需要更改视图(以及集合视图)的切换 isHidden 属性。

现在我想稍微润色一下,我的核心功能正在运行,我不想在我的空视图中包含的子视图中添加一些微妙的动画,例如使包含的 imageview 反弹显示。

所以我的问题是,检测UIView 何时显示的最佳方法是什么(即是否有我可以使用的viewDidAppear 类型回调)?

补充问题:我是新手...添加空视图并切换 isHidden 属性是一种好方法吗?还是我应该以不同的方式来做? (即我是否应该根据需要创建和销毁视图,而不是保留它)

谢谢

【问题讨论】:

  • 您可以为UIView 约束更改或UIView alpha 设置动画

标签: ios swift uiview swift3


【解决方案1】:

我认为最好的方法是扩展 UIView

extension UIView {

    func fadeIn(_ duration: TimeInterval? = 0.2, onCompletion: (() -> Void)? = nil) {
        self.alpha = 0
        self.isHidden = false
        UIView.animate(withDuration: duration!,
                       animations: { self.alpha = 1 },
                       completion: { (value: Bool) in
                          if let complete = onCompletion { complete() }
                       }
        )
    }

    func fadeOut(_ duration: TimeInterval? = 0.2, onCompletion: (() -> Void)? = nil) {
        UIView.animate(withDuration: duration!,
                       animations: { self.alpha = 0 },
                       completion: { (value: Bool) in
                           self.isHidden = true
                           if let complete = onCompletion { complete() }
                       }
        )
    }

}

因此,您只需调用 view.fadeIn() 以获得默认的 0.2 秒动画,或调用 view.fadeIn(1) 使其持续一秒。

您甚至可以添加完成事件:

view.fadeOut(0.5, onCompletion: {
    print("Animation completed, do whatever you want")
})

【讨论】:

  • 这是一个非常聪明的解决方案
【解决方案2】:

这行得通,我希望它可以帮助你。隐藏视图:

UIView.animate(withDuration: 0.3/*Animation Duration second*/, animations: {
     self.EmptyCollectionView.alpha = 0
}, completion:  {
   (value: Bool) in
       self.EmptyCollectionView.isHidden = true
})

显示视图:

self.EmptyCollectionView.isHidden = false
UIView.animate(withDuration: 0.3, animations: {
         self.EmptyCollectionView.alpha = 1
    }, completion:  nil)

【讨论】:

  • 我可以在 ShowView 完成中知道:为什么你没有将 .isHidden 设置为再次回退??
【解决方案3】:

在任何 UIView 类上设置 isHidden 时允许动画的 Swift 4.2 扩展:

extension UIView {
    func setIsHidden(_ hidden: Bool, animated: Bool) {
        if animated {
            if self.isHidden && !hidden {
                self.alpha = 0.0
                self.isHidden = false
            }
            UIView.animate(withDuration: 0.25, animations: {
                self.alpha = hidden ? 0.0 : 1.0
            }) { (complete) in
                self.isHidden = hidden
            }
        } else {
            self.isHidden = hidden
        }
    }
}

【讨论】:

    【解决方案4】:

    您可以将 EmptyCollectionView 的 alpha 属性设置为 0 隐藏或 1 显示

    UIView.animate(withDuration: 0.5) { 
        self.EmptyCollectionView.alpha = 0
    }
    

    还要确保 isOpaque 属性设置为 False 以启用视图的透明度

    【讨论】:

    • 但我想动画子视图而不是视图本身。我的 emptyview 包含一个 imageview,当 emptyview 显示或隐藏时,我想为 imageview 设置动画。我通过添加设置self.isHidden 并执行动画的显示和隐藏函数来修复它。烦人,因为现在有些视图使用 isHidden = false 而其他视图使用 view.show(),看起来有点乱,但现在可以使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多