动画 UIView isHidden 子视图

Posted

技术标签:

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

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

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

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

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

谢谢

【问题讨论】:

您可以为UIView 约束更改或UIView alpha 设置动画 【参考方案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(),看起来有点乱,但现在可以使用

以上是关于动画 UIView isHidden 子视图的主要内容,如果未能解决你的问题,请参考以下文章

点击文本字段后动画视图重置位置

用动画调整 UIView 的大小,子视图不会动画

UIView.animate 没有完美地动画布尔值

UIView 动画块不是动画视图的子视图

UIView 子视图没有动画

第一次设置 UIView 的新位置,它跳到屏幕顶部