11

この質問は「どうすればよいですか」ではなく、Objective-Cの一部のクラスプロパティに関する「なぜこれなのか」です。

以下の2つの例は許可されておらず、エラー(「式を割り当てられません」)が発生することを理解しています。

self.myUIView.frame.origin.x = 50;
self.myUIView.frame.origin = CGPointMake(50,50);

これを行う適切な方法は、新しいCGRectを作成し、必要な値を設定してから、それを割り当てることです。

CGRect rect = self.myUIView.frame;
rect.origin = CGPointMake(50, 50);
self.myUIView.frame = rect;

これがなぜなのか理解したいのですが。

CGRectは、2つの構造体を含む構造体です。制限は、そのメモリをオーバーフローする可能性のある割り当てを防ぐために、構造体の割り当て方法と関係がありますか?それとも、それは公的および私的財産に関する慣習のようなものですか?

これは些細なこと/基本的なことのように思えますが、これらの基本的なことについての泥だらけの/悪い理解を明らかにすることが重要だと思います。

4

2 に答える 2

9

これは、フレームの原点またはサイズを直接変更できた場合、UIViewのフレームプロパティのsetterメソッドをバイパスするためです。これは複数の理由で悪いでしょう。

UIViewは、フレームの変更について通知を受ける機会がありません。ただし、サブビューを更新したり、自分自身を再描画したりするには、これらの変更について知っている必要があります。

また、KVOを機能させるには、正しいセッターを使用する必要があります(setFrame:またはドット表記を使用)。

于 2012-08-26T18:28:20.260 に答える
6

の要素を割り当てる際の問題は、をstruct所有するクラスがが変更されたことを認識しstructないことです。structたとえば、フレームの原点について話す場合、これは良くありません。原点のUIView変更に応じて移動することが期待されますが、クラスには変更が通知されないため、移動は発生しません。

frame一方、UIViewsetFrameメソッドが呼び出されるため、の設定は検出できます。これは、UIViewサイズ変更、再配置などを処理できるコードです。

于 2012-08-26T18:30:20.350 に答える