Objective c NSSplitView修复了窗口大小调整时的拆分器?

Objective c NSSplitView修复了窗口大小调整时的拆分器?,objective-c,xcode,cocoa,Objective C,Xcode,Cocoa,我很难让一个视图正常运行 我目前的情况是: NSWindow NSView NSSplitView navView <NSView> contentView <NSView> 尽管如此,当我调整窗口大小时,拆分器仍然会移动 如果我点击拆分器,它会回复到200px。我怎样才能阻止它移动 我试过使用Autolayout,这有点像噩梦,所以我实际上禁用了它,并手动尝试,但毫无乐趣 有什么想法吗?我已经想好了 -(void)

我很难让一个视图正常运行

我目前的情况是:

NSWindow
   NSView
      NSSplitView
         navView <NSView>
         contentView <NSView>
尽管如此,当我调整窗口大小时,拆分器仍然会移动

如果我点击拆分器,它会回复到200px。我怎样才能阻止它移动

我试过使用Autolayout,这有点像噩梦,所以我实际上禁用了它,并手动尝试,但毫无乐趣

有什么想法吗?

我已经想好了

-(void)splitView:(NSSplitView *)sender resizeSubviewsWithOldSize:(NSSize)oldSize
{
    CGFloat dividerThickness = [sender dividerThickness];
    NSRect leftRect  = [[[sender subviews] objectAtIndex:0] frame];
    NSRect rightRect = [[[sender subviews] objectAtIndex:1] frame];
    NSRect newFrame  = [sender frame];

    leftRect.size.height = newFrame.size.height;
    leftRect.origin = NSMakePoint(0, 0);
    rightRect.size.width = newFrame.size.width - leftRect.size.width
- dividerThickness;
    rightRect.size.height = newFrame.size.height;
    rightRect.origin.x = leftRect.size.width + dividerThickness;

    [[[sender subviews] objectAtIndex:0] setFrame:leftRect];
    [[[sender subviews] objectAtIndex:1] setFrame:rightRect];
}

我为Swift编写了上述代码,并对其进行了扩展,以定义是否需要首选左视图或右视图:

var preferringLeftSideOfSplitView = true

func splitView(splitView: NSSplitView, resizeSubviewsWithOldSize oldSize: NSSize) {
    var dividerThickness = splitView.dividerThickness

    var leftRect = splitView.subviews[0].frame
    var rightRect = splitView.subviews[1].frame

    // Resizing and placing the left view
    splitView.subviews[0].setFrameOrigin(NSMakePoint(0, 0))
    if self.preferringLeftSideOfSplitView == true {
        splitView.subviews[0].setFrameSize(NSMakeSize(leftRect.width, splitView.frame.size.height))
    } else {
        splitView.subviews[0].setFrameSize(NSMakeSize(splitView.frame.size.width - rightRect.width - dividerThickness, splitView.frame.size.height))
    }

    // Resizing and placing the right view
    if self.preferringLeftSideOfSplitView == true {
        splitView.subviews[1].setFrameOrigin(NSMakePoint(leftRect.size.width + dividerThickness, 0))
        splitView.subviews[1].setFrameSize(NSMakeSize(splitView.frame.size.width - leftRect.size.width - dividerThickness, splitView.frame.size.height))
    } else {
        splitView.subviews[1].setFrameOrigin(NSMakePoint(splitView.frame.size.width - rightRect.width, 0))
        splitView.subviews[1].setFrameSize(NSMakeSize(rightRect.size.width, splitView.frame.size.height))
    }
}
将此添加到您的代理中


如果您的NSSplitView将包含lefView和rightView,这将使leftView保持固定宽度,而rightView将在调整主窗口的大小时调整大小。

仅添加一点,当我以编程方式设置窗口框架以适应contentView中较大的子视图时,这完全是错误的!
var preferringLeftSideOfSplitView = true

func splitView(splitView: NSSplitView, resizeSubviewsWithOldSize oldSize: NSSize) {
    var dividerThickness = splitView.dividerThickness

    var leftRect = splitView.subviews[0].frame
    var rightRect = splitView.subviews[1].frame

    // Resizing and placing the left view
    splitView.subviews[0].setFrameOrigin(NSMakePoint(0, 0))
    if self.preferringLeftSideOfSplitView == true {
        splitView.subviews[0].setFrameSize(NSMakeSize(leftRect.width, splitView.frame.size.height))
    } else {
        splitView.subviews[0].setFrameSize(NSMakeSize(splitView.frame.size.width - rightRect.width - dividerThickness, splitView.frame.size.height))
    }

    // Resizing and placing the right view
    if self.preferringLeftSideOfSplitView == true {
        splitView.subviews[1].setFrameOrigin(NSMakePoint(leftRect.size.width + dividerThickness, 0))
        splitView.subviews[1].setFrameSize(NSMakeSize(splitView.frame.size.width - leftRect.size.width - dividerThickness, splitView.frame.size.height))
    } else {
        splitView.subviews[1].setFrameOrigin(NSMakePoint(splitView.frame.size.width - rightRect.width, 0))
        splitView.subviews[1].setFrameSize(NSMakeSize(rightRect.size.width, splitView.frame.size.height))
    }
}
- (BOOL)splitView:(NSSplitView *)aSplitView shouldAdjustSizeOfSubview:(NSView *)subview
{
    return subview == rightView;
}