在水平NSSplitView的顶部窗格中重新定位NSBox

时间:2009-12-22 03:32:16

标签: cocoa frame nssplitview nsbox

我的问题与Cocoa中的坐标系有关,但我真的不知道。这一切都发生在水平NSSplitView的顶部窗格中。

很简单,我正在尝试将一个NSBox放在第二个下方(我将自定义视图加载到框中 - 一切正常)。顶部框的左上角位于窗格的左上角,永不改变。如果顶部NSBox的高度缩小,我希望第二个NSBox的顶部向下滑动。相反,如果顶部NSBox's高度增加,我希望底部NSBox向下滑动。

此代码被调用两次。 Box是正确的(第一次顶部框,第二次底部框)和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];

1 个答案:

答案 0 :(得分:0)

你想要做的不是那么难,但它需要一些子类化。首先,你需要继承NSSplitView并且重写 - (void)init或 - (void)awakeFromNib来添加这一行:

[self setAutoresizesSubviews:YES];  //

然后你需要子类化这两个框并设置他们的自动调整大小掩码,在 - (void)init或 - (void)viewWillMoveToSuperview:(NSView *)newSuperView。 对于您可能想要的第一个框:

[newInstance setAutoresizingMask:NSViewNotSizable];

对于你可能想要的第二个bbox:

[newInstance setAutoresizingMask:NSViewMinXMargin | NSViewMinYMargin];

另见NSView。需要进行一些实验才能获得正确的组合,但之后它的效果非常好。