我想為 a 設定影片CALAyer,使其看起來像是憑空出現的。我想我可以先將圖層的變換設定為“縮放到 x: 0, y: 0”。然后做一個影片,將transform設定為“縮放到x:1,y:1”,即標識。我認為這會使圖層看起來從無到有放大。但是,當我嘗試實作這一點時,圖層立即出現而沒有影片。
MCVE:
class MyView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
func commonInit() {
backgroundColor = .clear
clipsToBounds = false
setupLayers()
}
var squareLayer: CAShapeLayer!
private func setupLayers() {
layer.sublayers?.forEach { $0.removeFromSuperlayer() }
squareLayer = CAShapeLayer()
layer.addSublayer(squareLayer)
}
override func layoutSubviews() {
super.layoutSubviews()
drawLayers()
}
func drawLayers() {
squareLayer.fillColor = UIColor.red.cgColor
squareLayer.path = UIBezierPath(rect: bounds).cgPath
squareLayer.frame = bounds
}
}
然后在我的 VC 中:
@IBAction func click() {
myView = MyView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
view.addSubview(myView)
myView.drawLayers()
myView.squareLayer.setAffineTransform(.init(scaleX: 0, y: 0))
CATransaction.begin()
CATransaction.setAnimationDuration(1)
self.myView.squareLayer.setAffineTransform(.init(scaleX: 1, y: 1))
CATransaction.commit()
}
我認為這是因為第一個setAffineTransform呼叫也是影片的(我不知道為什么會產生影響,但我懷疑這可能會產生影響),所以我嘗試將第二個呼叫移動到完成塊中:
@IBAction func click() {
myView = MyView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
view.addSubview(myView)
myView.drawLayers()
CATransaction.begin()
CATransaction.setCompletionBlock {
CATransaction.begin()
CATransaction.setAnimationDuration(1)
self.myView.squareLayer.setAffineTransform(.init(scaleX: 1, y: 1))
CATransaction.commit()
}
myView.squareLayer.setAffineTransform(.init(scaleX: 0, y: 0))
CATransaction.commit()
}
但是,輸出是相同的。另一方面,如果我在第一次setAffineTransform通話后稍等片刻,則它可以作業:
@IBAction func click() {
myView = MyView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
view.addSubview(myView)
myView.drawLayers()
myView.squareLayer.setAffineTransform(.init(scaleX: 0, y: 0))
DispatchQueue.main.asyncAfter(deadline: .now() 0.1) {
CATransaction.begin()
CATransaction.setAnimationDuration(1)
self.myView.squareLayer.setAffineTransform(.init(scaleX: 1, y: 1))
CATransaction.commit()
}
}
我不認為這是我應該如何解決這個問題。據推測,在那段時間里,呼叫了一些生命周期方法(我不知道是哪個),而我應該做的是setAffineTransform在該生命周期方法之后進行第二次呼叫......(?)
我知道我可以用CABasicAnimation它來代替,但我不喜歡我需要如何使用委托來檢測影片的結束。這讓很多事情對我來說非常麻煩。由于延遲 0.1 秒有效,這對CATransactions 來說不可能,對吧?
如何CALayer使用影片顯示?
uj5u.com熱心網友回復:
另一方面,如果我等一下
沒錯。圖層必須是渲染樹的一部分才能進行影片處理,因此您不能添加圖層并將其作為同一事務的一部分進行影片處理。因此,您的異步呼叫在附加影片之前等待當前事務提交和下一個事務開始,實際上是一個完全正確的解決方案。
另一種可能是CATransaction.flush()添加圖層后呼叫;這有效地提前提交了當前事務。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/324372.html
