私はプロジェクトで、サブビューのプログラムによるサイズ変更と再配置を行うビューが非常に多いです。コードのこのタイプは、常に今、年間のカップルのための私のためにうまく働いていなぜビューを再配置するためにCGRectを再使用するのが悪いですか?
CGRect rect = self.btnOne.frame;
// change values for rect
self.btnOne.frame = rect;
// re-use same CGRect to reposition other views
rect = self.btnTwo.frame;
// change values
self.btnTwo.frame = rect;
// etc. ...
:私はこのようなコードを使用して、layoutSubviews
でこれを行います。私は最近、このようなコードを共同作業者のプロジェクトに追加しました。それは今、非常に奇妙な動作を始めています。理由が分からないので、ここで再利用されるrect
オブジェクトは、ビューのフレームが割り当てられてからブロックの最後のビューのフレームに再割り当てされるまでの間に、ランダムに独自の値を変更することがあります。その結果、不適切な位置にあるサブビューが発生します。このエラーは通常rect.origin.y
の値を取得しているか、その逆の形をとってrect.origin.x
の形をとっているようです。
この問題は実際のデバイスでのみ発生します。シミュレータ上で実行されている全く同じコードに問題はありません。
修正がそうのように、各サブビューのために独自に宣言CGRectオブジェクトを使用することです:
CGRect rect = self.btnOne.frame;
// change values for rect
self.btnOne.frame = rect;
// declare new CGRect to reposition other views
CGRect rect2 = self.btnTwo.frame;
// change values
self.btnTwo.frame = rect2;
私はこの変更を行うと、すべてが正しく動作に戻ります。しかし、私は本当になぜこれが起こるか知っていることに興味があり、特にそれがデバイス上で起こる理由を知っていますが、シミュレータではありません。また、同僚がビューを変更するまでは起こらないようですが、ビューの位置付けに関係なくどのような変更がこれを行うことができるかはわかりません。
もう1つの変更点は、コードをインポートしたプロジェクトがARCを使用しているのに対して、元のコードはARCを使用していないことです。
'self.btnOne.frame;'行は効果がありません(また、コンパイラの警告が必要です)。これはあなたの本当のコードですか? –
rectはスタック上にあるので、スタック上の他の場所に配列があると、配列の一部(または他の構造体)の終わり(または先頭より前)にコードが書き込まれていると、rectの一部を上書きする可能性があります。変数にウォッチポイントを置いて変数がどこで変更されているのかを確認して、変化の原因を正確に把握することができます。 – user1118321
あなたの同僚のプロジェクトのビューが変換の影響を受けるかどうかを教えてください。 Apple docsは変換プロパティについて警告しています。「このプロパティがID変換でない場合、frameプロパティの値は定義されていないため、無視する必要があります。 –