プログラムでフレームの原点を設定しようとしています。
方法1:
button.frame.Origin.y = 100;
方法2:
CGRect frame = button.frame;
frame.Origin.y = 100;
方法1を試しましたが、機能しません(式が割り当てられないというエラーが表示されます)。方法2は機能しています。なぜそうなのですか?
私が正しく行っていることについてのガイダンスが必要です。
方法1を実行できない理由は、フレームの個々のプロパティが読み取り専用であるためです。ただし、フレーム全体は書き込み可能/割り当て可能であるため、方法2を実行できます。
次のようなトリックを行うこともできます。
CGRect newFrame = button.frame;
newFrame.Origin.y += 100; // add 100 to y's current value
button.frame = newFrame;
ええと button.frame.Origin.y
値を返します。
これを使用している場合は、このエラーが発生します...
式は割り当てできません。
button.frame.Origin.y = 100;
だからこれは正しい方法です
CGRect frame = button.frame;
frame.Origin.y = 100;
そうでなければあなたはこのようにすることができます...
button.frame = CGRectMake(button.frame.Origin.x, 100, button.frame.size.width, button.frame.size.height)
これは、フレームの原点またはサイズを直接変更できた場合、UIViewのフレームプロパティのsetterメソッドをバイパスするためです。これは複数の理由で悪いでしょう。
UIViewは、フレームの変更について通知を受ける機会がありません。ただし、サブビューを更新したり、自分自身を再描画したりするには、これらの変更について知っている必要があります。
button.frame.Origin.y = 100;
次の呼び出しに等しい:
[button getFrame].Origin.y = 100;
その中で [button getFrame]
はコピーされたCGRect
を提供します。
構造体の構造体の変数を設定しようとしています。 UIView
から構造体へのポインタはありません(基本的なC struct
なので、指摘することはできません)。したがって、代わりにコピーします。
つまり、基本的には、構造をコピーして設定することになります。しかし、それはそのようには機能しません。