0

私が抱えている問題は、ココアの座標系に関係していますが、本当にわかりません。これはすべて、水平の上部ペインで発生していNSSplitViewます。

非常に簡単に言えば、1 つを 2 つ目のすぐ下に配置しようとしてNSBoxいます (カスタム ビューをボックスにロードします - すべて正常に動作します)。トップ ボックスの左上隅はペインの左上隅にあり、変更されることはありません。トップの高さが縮む場合は、2 番目のトップをそのすぐ下にスライドさせNSBoxたいと思います。NSBox逆に、トップのNSBox's高さが高くなったら、ボトムNSBoxをスライドさせたい。

このコードは 2 回呼び出されます。ボックスは正しく (最初は上のボックス、2 回目は下のボックス)、v は正しいです (これは私がボックスに読み込んでいるビューです - これは問題なく動作し、それが原因で上のボックスの高さが変化します)。

 NSSize destBoxSize = [[box contentView] frame].size;  //the size of the box in the view to load the view into
 NSSize newViewSize = [v frame].size;  // the size of the view to be loaded 

 float deltaWidth = [horizSplitView frame].size.width - destBoxSize.width;
 float deltaHeight = newViewSize.height - destBoxSize.height;
 NSRect boxFrame = [box frame];
 boxFrame.size.height += deltaHeight;
 boxFrame.size.width += deltaWidth; 
 boxFrame.origin.y -= deltaHeight;

 NSLog(@"vc=%@ boxFrame x%f y%f h%f w%f", nibName, boxFrame.origin.x, boxFrame.origin.y, boxFrame.size.height, boxFrame.size.width);

 // Clear the box for resizing
 [box setContentView:nil]; 
 [box setContentView:v];
 [box setFrame:boxFrame];
4

1 に答える 1

0

やりたいことはそれほど難しくありませんが、サブクラス化が必要になります。まず、NSSplitView をサブクラス化し、-(void)init または -(void)awakeFromNib のいずれかをオーバーライドして、次の行を追加する必要があります。

[self setAutoresizesSubviews:YES];  //

次に、2 つのボックスをサブクラス化し、自動サイズ変更マスクを -(void)init または -(void)viewWillMoveToSuperview:(NSView *)newSuperView で設定する必要があります。最初のボックスには、おそらく次のものが必要です。

[newInstance setAutoresizingMask:NSViewNotSizable];

2 番目の bbox には、次のようにします。

[newInstance setAutoresizingMask:NSViewMinXMargin | NSViewMinYMargin];

NSViewも参照してください。適切な組み合わせを得るには少し実験が必要ですが、非常にうまく機能します。

于 2009-12-22T11:57:01.657 に答える