イメージビューがあり、そのイメージビューをカラーでアニメーション化したいと思います。したがって、私の画像は最初は緑色の画像で、次にオレンジ色の画像にアニメーション化します。
これは私のコードです:
class TestView: UIView {
func startAnimate(){
let size:CGSize = self.bounds.size
let layer = UIImageView(image: UIImage(named: "LaunchIcon"))
layer.frame = self.bounds
let initialRect:CGRect = CGRect.init(x: 0, y: size.height, width: size.width, height: 0)
let finalRect:CGRect = CGRect.init(x: 0, y: size.height, width: size.width, height: size.height)
let sublayer = CALayer()
sublayer.frame = initialRect
sublayer.backgroundColor = UIColor.orange.cgColor
sublayer.opacity = 0.5
let mask:CAShapeLayer = CAShapeLayer()
mask.frame = self.bounds
mask.path = UIBezierPath(rect: self.bounds).cgPath
mask.fillColor = UIColor.black.cgColor
layer.layer.addSublayer(sublayer)
layer.layer.mask = mask
self.layer.addSublayer(layer.layer)
let boundsAnim:CABasicAnimation = CABasicAnimation(keyPath: "bounds")
boundsAnim.toValue = NSValue.init(cgRect:finalRect)
let animationGroup = CAAnimationGroup()
animationGroup.animations = [boundsAnim]
animationGroup.isRemovedOnCompletion = false
animationGroup.duration = 2
animationGroup.fillMode = kCAFillModeForwards
sublayer.add(animationGroup, forKey: nil)
}
}
私の結果:
最初の問題は、オレンジが私の画像だけでなくフレーム全体を撮影していることです。2番目の問題は、それが一番上まで満たされないことです。
コードに関する問題のいくつか:
mask
レイヤーに長方形を追加しますが、レンダリングにはまったく影響しません。フレーム、位置、形などを変更することは決してないので、その目的は明確ではありません。
sublayer
ガラスの形の中にしか見えないはずですよね?ただし、コードでは、これを長方形として定義し、サブビューであるため、ガラス画像の形状によってトリミングされる理由はありません。
view
sをレイヤーと呼ばないでください。コードを読んでいる人にとっては混乱を招きます。それは層ではない場合は、それを呼び出すことはありません層と、シンプル。
let layer = UIImageView(image:UIImage(named: "LaunchIcon"))
CABasicAnimation
実用的な解決策:
実際、ここでCoreAnimationを使用する必要はありませんUIKit
。これは、より高いレベルのプレーンで実装できます。この場合の親友は、のマスクプロパティUIView
とanimateWithDurationメソッドです。
class GlassView: UIView {
let liquidView = UIView() //is going to be animated from bottom to top
let shapeView = UIImageView() //is going to mask everything with alpha mask
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
func setup() {
self.backgroundColor = UIColor.darkGray
self.liquidView.backgroundColor = UIColor.orange
self.shapeView.contentMode = .scaleAspectFit
self.shapeView.image = UIImage(named: "glass")
self.addSubview(liquidView)
self.mask = shapeView
layoutIfNeeded()
reset()
}
override func layoutSubviews() {
super.layoutSubviews()
liquidView.frame = self.bounds
shapeView.frame = self.bounds
}
func reset() {
liquidView.frame.origin.y = bounds.height
}
func animate() {
reset()
UIView.animate(withDuration: 1) {
self.liquidView.frame.origin.y = 0
}
}
}
出力:
実装の詳細:
ビューのアルファチャネルは、ビューのコンテンツと背景がどれだけ透けて見えるかを決定します。完全にまたは部分的に不透明なピクセルを使用すると、基になるコンテンツが透けて見えますが、完全に透明なピクセルはそのコンテンツをブロックします。
マスク画像が.png
透明な背景に図形を含んでいることを確認してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加