まず第一に、これは一連の記事であり、このトピックの下にある他の記事を参照すると、この記事を理解するのに役立ちます。
iOS の CALayer は主にコンテンツの表示とアニメーションの操作を目的として設計されており、CALayer 自体は UIKit に含まれておらず、イベントに応答することはできません。 CALayer はアニメーション操作機能を念頭に置いて設計されているため、CALayer の多くのプロパティは変更するとアニメーション効果を形成できます。このプロパティは「暗黙的アニメーション プロパティ」と呼ばれます。ただし、UIView のルート レイヤの場合、プロパティの変更はアニメーション効果を形成しません。多くの場合、ルート レイヤはコンテナとして機能するため、そのプロパティが変更されてアニメーション効果が形成されると、サブレイヤに直接影響します。さらに、UIView のルート レイヤの作成は iOS によって完全に完了され、再作成することはできませんが、ルート レイヤにサブレイヤを追加またはルート レイヤから削除することはできます。
2. フレーム自体はアニメーション効果をサポートしておらず、通常は代わりに境界と位置が使用されるため、フレーム属性は CALayer ではほとんど使用されません。
3. CALayer の透明度はアルファではなく不透明度で表され、中心点は中心ではなく位置で表されます。
4.anchorPoint 属性は、レイヤーのアンカーポイントです。範囲は (0~1,0~1) で、このポイントは常に位置 (中心点) と一致します。レイヤーの中心点を固定した後、anchorPoint を調整すると、レイヤーの表示位置を調整する効果が得られます (常に位置と一致するため)
anchorPoint の役割をさらに説明するために、次のサイズのレイヤーがあると仮定します。 100*100、現在の中心点の位置は (50,50) で、そこからフレーム (0,0,100,100) を取得できます。前述したように、anchorPoint のデフォルトは (0.5, 0.5) であり、これは中心点の位置と一致します。このとき、anchorPoint をアンカーの (0,0) に変更する場合は、図 1 に示すようなグラフィック記述を使用します。ポイントはレイヤーの左上隅にありますが、中心点の位置は変更されないため、図 2 に示すようにレイヤーは右下隅に移動し、anchorPoint を (1,1,) に変更します。アンカーポイントはレイヤーの右下隅にあります。図
コード
import UIKitclass ViewController: UIViewController { @IBOutlet weak var viewForLayer: UIView! var myLayer: CALayer{ return viewForLayer.layer } override func viewDidLoad() { super.viewDidLoad() setUpLayer() // Do any additional setup after loading the view, typically from a nib. } func setUpLayer(){ myLayer.backgroundColor = UIColor.blueColor().CGColor myLayer.borderWidth = 100 myLayer.borderColor = UIColor.redColor().CGColor myLayer.shadowRadius = 3 myLayer.shadowOffset = CGSize(width: 0, height: 3) myLayer.shadowOpacity = 0.7 myLayer.contents = UIImage(named: "star")?.CGImage myLayer.contentsGravity = kCAGravityCenter myLayer.magnificationFilter = kCAFilterTrilinear myLayer.geometryFlipped = false } @IBAction func tap(sender: AnyObject) { myLayer.shadowOpacity = myLayer.shadowOpacity == 0.7 ? 0.0 : 0.7 } @IBAction func pinch(sender: UIPinchGestureRecognizer) { let offset: CGFloat = sender.scale < 1 ? 5.0 : -5.0 let oldFrame = myLayer.frame let oldOrgin = oldFrame.origin let newSize = CGSize(width: oldFrame.width + (offset * -2.0), height: oldFrame.height + (offset * -2.0)) let newOrgin = CGPoint(x: oldOrgin.x + offset, y: oldOrgin.y + offset) let newFrame = CGRect(origin: newOrgin, size: newSize) if newFrame.width >= 100.0 && newFrame.width < 300 { myLayer.borderWidth -= offset myLayer.cornerRadius += offset / 2.0 myLayer.frame = newFrame } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. }}
レンダリング