簡體   English   中英

動畫 UIView isHidden subviews

[英]Animating UIView isHidden subviews

我有一個 UIView EmptyCollectionView ,當我的 UICollectionView 為空時顯示。 我的工作方式是在我的 ViewController 的 viewDidLoad 中創建 UIView 和addSubview ,然后根據需要更改視圖(以及集合視圖)的切換 isHidden 屬性。

我現在想稍微完善一下我的核心 function 工作,我不想在我的空視圖中包含的子視圖中添加一些微妙的 animation,例如在顯示上顯示包含的imageview

所以我的問題是,檢測UIView何時顯示的最佳方法是什么(即是否有我可以使用的viewDidAppear類型回調)?

補充問題:我是新手......添加空視圖並切換 isHidden 屬性是這樣做的好方法嗎? 還是我應該以不同的方式來做? (即我應該根據需要創建和銷毀視圖,而不是保留它)

謝謝

這項工作,我希望它可以幫助你。 要隱藏視圖:

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)

我認為最好的方法是擴展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")
})

在任何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
        }
    }
}

您可以將EmptyCollectionView的alpha屬性設置為0以隱藏或顯示1

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

還要確保將isOpaque屬性設置為False以啟用視圖的透明度

Swift 5

import UIKit

extension UIView {
    
    func animateSetHidden(_ hidden: Bool, duration: CGFloat = CATransaction.animationDuration(), completion: @escaping (Bool)->() = { _ in}) {
        
        if duration > 0 {

            if self.isHidden && !hidden {
                self.alpha = 0
                self.isHidden = false
            } 
            UIView.animate(withDuration: duration, delay:0, options: .beginFromCurrentState) {
            
                self.alpha = hidden ? 0 : 1
            
            } completion: { c in
          
                if c {
                    self.isHidden = hidden
                }
                completion(c)
            
            }

        } else {
            
            self.isHidden = hidden
            self.alpha = hidden ? 0 : 1
            completion(true)

        }
        
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM