2009-05-09 29 views
21

インターフェイスビルダを使用すると、サイズ変更時にオブジェクトが固執するコーナーを選択できます。あなたはこれをプログラム的にどのようにすることができますか?Cocoa NSViewの自動サイズ変更プロパティ

Interface Builder

+0

[Appleが導入されたことに注意してくださいAutoLayout framework](http://developer.apple.com/library/mac/#releasenotes/UserExperience/RNAutomaticLayout/_index.html#//apple_ref/doc/uid/TP40010631)をご覧ください。 – JJD

答えて

19

のNSViewのsetAutoresizingMask:方法と関連resizing masksを参照してください。

+0

[resizing masks](https://developer.apple.com/documentation/appkit/nsview.autoresizingmask)へのリンクです。 –

8

各ビューにはフラグのマスクがあり、autoresizingMaskプロパティには、resizing masksから必要なビヘイビアのORを設定します。さらに、スーパービューはresize its subviewsに設定する必要があります。

最後に、基本的なマスク定義のリサイズオプションに加えて、あなたは完全に私がautoresizingBitマスクが恐ろしく命名されていることがわかり-resizeSubviewsWithOldSize:

30

を実装することにより、サブビューのレイアウトを制御することができますので、私はにNSViewの上のカテゴリを使用します物事はもう少し明示的に行います。


// MyNSViewCategory.m: 
@implementation NSView (myCustomMethods) 

- (void)setAutoresizingBit:(unsigned int)bitMask toValue:(BOOL)set 
{ 
    if (set) 
    { [self setAutoresizingMask:([self autoresizingMask] | bitMask)]; } 
    else 
    { [self setAutoresizingMask:([self autoresizingMask] & ~bitMask)]; } 
} 

- (void)fixLeftEdge:(BOOL)fixed 
{ [self setAutoresizingBit:NSViewMinXMargin toValue:!fixed]; } 

- (void)fixRightEdge:(BOOL)fixed 
{ [self setAutoresizingBit:NSViewMaxXMargin toValue:!fixed]; } 

- (void)fixTopEdge:(BOOL)fixed 
{ [self setAutoresizingBit:NSViewMinYMargin toValue:!fixed]; } 

- (void)fixBottomEdge:(BOOL)fixed 
{ [self setAutoresizingBit:NSViewMaxYMargin toValue:!fixed]; } 

- (void)fixWidth:(BOOL)fixed 
{ [self setAutoresizingBit:NSViewWidthSizable toValue:!fixed]; } 

- (void)fixHeight:(BOOL)fixed 
{ [self setAutoresizingBit:NSViewHeightSizable toValue:!fixed]; } 

@end 

C

// MyNSViewCategory.h: 
@interface NSView (myCustomMethods) 

- (void)fixLeftEdge:(BOOL)fixed; 
- (void)fixRightEdge:(BOOL)fixed; 
- (void)fixTopEdge:(BOOL)fixed; 
- (void)fixBottomEdge:(BOOL)fixed; 
- (void)fixWidth:(BOOL)fixed; 
- (void)fixHeight:(BOOL)fixed; 

@end 
次のように使用する:e.Jamesの答え@

[someView fixLeftEdge:YES]; 
[someView fixTopEdge:YES]; 
[someView fixWidth:NO]; 
+8

実際には、はい。私はタッチスクリーンインターフェース用のカスタムUIに取り組んできましたが、Interface Builderはその仕事のための適切なツールではありません。私はコードですべてをやってきましたが、私は振り返っていません。 –

+1

ありがとう、このコードは便利です。 – Karolis

+0

@Karolis:それを聞いてうれしい。メモを残す時間をとっていただきありがとうございます。 –

3

は私だけで、より身近な命名で新しい列挙型を作成するためのアイデアを与えた:

typedef NS_OPTIONS(NSUInteger, NSViewAutoresizing) { 
    NSViewAutoresizingNone     = NSViewNotSizable, 
    NSViewAutoresizingFlexibleLeftMargin = NSViewMinXMargin, 
    NSViewAutoresizingFlexibleWidth  = NSViewWidthSizable, 
    NSViewAutoresizingFlexibleRightMargin = NSViewMaxXMargin, 
    NSViewAutoresizingFlexibleTopMargin = NSViewMaxYMargin, 
    NSViewAutoresizingFlexibleHeight  = NSViewHeightSizable, 
    NSViewAutoresizingFlexibleBottomMargin = NSViewMinYMargin 
}; 

また、私の研究から、私がいることを発見しました@ James.sはNSViewの追加で深刻なバグを持っています。 Cocoaの座標系は、iOS座標系の点でy軸を反転しています。したがって、下部と上部の余白を固定するために、あなたが書く必要があります:

- (void)fixTopEdge:(BOOL)fixed 
{ [self setAutoresizingBit:NSViewMaxYMargin toValue:!fixed]; } 

- (void)fixBottomEdge:(BOOL)fixed 
{ [self setAutoresizingBit:NSViewMinYMargin toValue:!fixed]; } 

ココアのドキュメントから:

NSViewMinYMargin

The bottom margin between the receiver and its superview is flexible. 
Available in OS X v10.0 and later. 
+2

+1ハイブリッドアプローチ!私はそのコードに問題はなかったが、おそらくOSXとiOSの違いは何か?今あなたは私が好奇心を持っている... –