web-dev-qa-db-ja.com

iOSでフレームの原点を設定する

プログラムでフレームの原点を設定しようとしています。

方法1:

button.frame.Origin.y = 100;

方法2:

CGRect frame = button.frame;
frame.Origin.y = 100;

方法1を試しましたが、機能しません(式が割り当てられないというエラーが表示されます)。方法2は機能しています。なぜそうなのですか?

私が正しく行っていることについてのガイダンスが必要です。

14
lakesh

方法1を実行できない理由は、フレームの個々のプロパティが読み取り専用であるためです。ただし、フレーム全体は書き込み可能/割り当て可能であるため、方法2を実行できます。

次のようなトリックを行うこともできます。

CGRect newFrame = button.frame;
newFrame.Origin.y += 100; // add 100 to y's current value
button.frame = newFrame;
27
Stunner

ええと 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)
3
Dharmbir Singh

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

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

1
Prakash Desai
button.frame.Origin.y = 100;

次の呼び出しに等しい:

[button getFrame].Origin.y = 100;

その中で [button getFrame]はコピーされたCGRectを提供します。

構造体の構造体の変数を設定しようとしています。 UIViewから構造体へのポインタはありません(基本的なC structなので、指摘することはできません)。したがって、代わりにコピーします。

つまり、基本的には、構造をコピーして設定することになります。しかし、それはそのようには機能しません。

0
viral