1

UIView のプロパティ レイヤーは、Apple のドキュメントで次のように説明されています。

レンダリングに使用されるビューのコア アニメーション レイヤー。(読み取り専用)

@property(nonatomic, readonly, retain) CALayer *layer

読み取り専用であることは明らかです。しかし、私のプロジェクトでは、なぜ次のように設定できるのですか:

NSLog(@"before: %f",self.myView.laye.frame.size.width);
[self.myView.layer setAffineTransform:CGAffineTransformMakeScale(2, 2)];
NSLog(@"after: %f",self.myView.laye.frame.size.width);
//log shows us that the frame is modified 

この状況では本当に混乱します。誰でも私を助けることができますか?前もって感謝します!

4

2 に答える 2

4

プロパティは読み取り専用です。layerレイヤーを別のレイヤーに変更することはできませんがCALayer、プロパティに含まれるオブジェクトは不変ではなく、独自のプロパティを設定できます。

次のことはできません。

self.myView.layer = newLayer;
// equivalent to [self.myView setLayer:newLayer];

しかし、次のことができます。

[self.myView.layer setAffineTransform:CGAffineTransformMakeScale(2, 2)];

setLayer:使えないセレクターです。

于 2012-10-11T10:13:19.333 に答える
1

CALayerは UIKit の一部ではありません。これは Quartz Core フレームワークの一部です

UIViewクラスは UIKit の一部です。両方のドキュメントを読んで違いを知ることができます

UIView は NSObject から継承し、CALayer も NSObject から継承するため、実行中は次のようになります。 [self.myView.layer setAffineTransform:CGAffineTransformMakeScale(2, 2)];

layer を割り当てるのではなく、実際にはCALayerクラスのレイヤー プロパティに直接アクセスしているため、 CALayerのドキュメントでわかるように、レイヤーの位置、サイズ、および変換を操作できます。これらすべてのことが可能になります。

于 2012-10-11T10:35:01.587 に答える