2009-05-11 7 views
1

私はCocoaアプリケーションのマニュアルレイアウトを行っています。ある時点で、NSViewサブクラスの内部サイズを調べる必要があります。 (例えば、NSBoxの中で私の子ビューに利用できる高さは何ですか?)NSViewサブクラスの内部/クライアントサイズを取得するにはどうすればよいですか?

私は座標系を原点とし、座標変換を実行する必要があります。

誰かが私にヒントを与えることができるなら、私はこのサイズを今までに得る方法を見つけ出すことができず、うれしいでしょう。

私が知りたいもう一つの興味深いプロパティは、ビューの最小サイズです。

答えて

5

は、ほとんどのビューでお探しのものです。しかし、NSBoxは、ボックスビューの境界ではなくボックスのコンテンツビューの境界を見たいので、特別なケースです(ボックスビューにはタイトル、エッジなどが含まれます)。また、境界矩形は常にボックスの実際のサイズですが、枠の矩形は境界に相対的に変更して、ビューのコンテンツに変換を適用できます(200x200イメージを200x100フレームに縮小するなど)。

だから、ほとんどのビューのためにあなただけ [parentView bounds]を使用し、NSBoxのために、あなたは [[theBox contentView] bounds]を使用します、そして、あなたはあなたのコンテンツを追加する [parentView addSubview: myView]ではなく、 [[theBox contentView] addSubview: myView]を使用します。

5

残念ながら、すべてのNSViewのサブクラスのためにこれを行うための標準的な方法はありません。あなたは、多くの場合、これを使用して自分自身を見つける場合は、次のように、あなたがNSBoxにカテゴリを作成することができ

NSRect availableRect = [someNSBox bounds]; 
NSSize boxMargins = [someBox contentViewMargins]; 
availableRect = NSInsetRect(availableRect, boxMargins.width, boxMargins.height); 

:次のようにあなたの具体的な例では、NSBox内の位置と子ビューのサイズを計算することができる

// MyNSBoxCategories.h 
@interface NSBox (MyCategories) 
- (NSRect)contentFrame; 
@end 


// MyNSBoxCategories.m 
@implementation NSBox (MyCategories) 
- (NSRect)contentFrame 
{ 
    NSRect frameRect = [self bounds]; 
    NSSize margins = [self contentViewMargins]; 
    return NSInsetRect(frameRect, margins.width, margins.height); 
} 
@end 

そして、あなたはそうのようにそれを使用します。

#import "MyNSBoxCategories.h" 

//... 

NSRect frameRect = [someNSBox contentFrame]; 
[myContentView setFrame:frameRect]; 
[someNSBox addSubview:myContentView]; 
+0

ご返信ありがとうございます。私は別の例を使用していたはずですが、NSBoxは他の多くのクラスに欠けているこれらの余分なメソッドを持っているという点で多少特別です:( –

+0

問題ありません。 –

関連する問題