2009-07-14 12 views
3

NSViewの寸法をプログラマティックに変更したいことがあります。これを行うには、さまざまなビューの寸法を取得し、それらを相互に調整し、setFrame:を使用して位置を変更すると便利です。NSViewのフレームメソッドが間違った結果を返すのはなぜですか?

問題は、フレームメソッドは通常、明らかに間違っているNSRectsを私の観点から返すことです。

私はInterface Builderで設定されたNSPanelと私のメインプログラムへの様々な接続を持つプログラムを持っています。フレームで返されたNSRectをテストするために、アプリケーションのawakeFromNib:メソッドでパネルを開き、いくつかのNSRectを取得してコンソールに出力しました。 (I)パネルとの両方のコントロールが画面上に表示されている

in awakeFromNib 
the frame is 0, 0, 0, 0 
the frame is 0, 1079230464, 0, 1078329344 

注こと:このコードの

- (void)awakeFromNib { 
    NSLog(@"in awakeFromNib"); 
    [self showPrefsSheet:self]; //this is the prefs sheet with the controls of interest 
           //note that it does indeed pop up and is displayed 
    originalFrame = [aTextView frame]; 
    NSLog(@"the frame is %d, %d, %d, %d", originalFrame.origin.x, originalFrame.origin.y, originalFrame.size.width, originalFrame.size.height); 
    originalFrame = [aButton frame]; 
    NSLog(@"the frame is %d, %d, %d, %d", originalFrame.origin.x, originalFrame.origin.y, originalFrame.size.width, originalFrame.size.height); 
    return; 
    } 

結果がコンソールに次のようになります。ここでは

は私のawakeFromNibです; (ii)私はアウトレットが適切に接続されているという事実を知っている。なぜなら私はコントロールに物事をプログラムで行い、それを動作させることができるからだ。 (iii)インターフェイスビルダは、「サイズ&位置」のインスペクタで正しいフレームサイズを表示します。要するに、プログラムに関する他のすべてが完全に機能しています。実際にはフレームの寸法が適切に設定されていないようです。

誰かが実際のフレーム情報を取得する方法を教えてもらえますか?または、少なくとも私が見ている結果を説明する?

答えて

9

フレーム座標は浮動小数点ですが、ログメッセージには%dが使用されています。 (ints)。

変更のNSLog文字列に:

@"the frame is %f, %f, %f, %f" 

編集:

#define RECTLOG(rect) (NSLog(@"" #rect @" x:%f y:%f w:%f h:%f", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height)); 

あなたはその後、簡単RECTログを行うことができます:

ここrectsをデバッグするときに私が使用して非常に便利なマクロです

RECTLOG([aTextView frame]); 
+0

男の子、私の顔は赤いです!ありがとう、Kailoa。 私は気が気になりませんが、これを私の後ろに置くことができてうれしいです。 – Dennis

+0

問題ありません。超便利なマクロも追加します。 – amattn

4

NSRectをロギングするとき、フィールドは整数ではなく浮動小数点値であることに注意してください。

よりもむしろ形式を書くことは、自分自身を指定子(インラインまたはマクロのいずれかを介して)、フレームワークがあなたのために提供した機能を使用します。

NSLog(@"frame - %@", NSStringFromRect([view frame])); 

も参照してください:

NSStringFromSize 
NSStringFromPoint 
NSStringFromRange 

など

+0

私は同意します。 'NSStringFrom *'メソッドは 'NSLog'のために使用するのが最良です。彼らはあなたにいくつかきれいにフォーマットされた結果を与えます。 – Alex

+0

はい、唯一の問題は、NSStringFromRectがiPhoneプロジェクトで警告を生成することです。 iPhoneではNSStringFromCGRectを使用する必要があります。 また、マクロラッパーを使用すると、変数名を埋め込むことができます。 いずれにしてもうまくいきます。 – amattn

+0

CGRectをお持ちの場合は、適切なNSStringFromCGRect型を使用してください。あたかもコードを書くときに変数の型が分からないかのようにはなりません。 NS_BUILD_32_LIKE_64が構築中のものに該当するかどうかを検討し、必要に応じて使用してください。 –

関連する問題