[英]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.