2

NSSplitView を動作させるのに少し苦労しています。

私が現時点で持っているものは次のとおりです。

NSWindow
   NSView
      NSSplitView
         navView <NSView>
         contentView <NSView>

私が抱えている問題は、ウィンドウのサイズを変更するときにスプリッターの位置がずれることです。

分割ビューのデリゲートでは、私はすでに持っています:

-(CGFloat)splitView:(NSSplitView *)splitView constrainMaxCoordinate:(CGFloat)proposedMaximumPosition ofSubviewAt:(NSInteger)dividerIndex{
    return 200;
}

-(CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMinimumPosition ofSubviewAt:(NSInteger)dividerIndex{
    return 200;

}

それにもかかわらず、ウィンドウのサイズを変更してもスプリッターは移動しました。

スプリッターをクリックすると、必要に応じて 200px に戻ります。これどうやったら動かなくなるの?

私は Autolayout を試しましたが、これは使用するのが少し悪夢でした。

何か案は?

4

3 に答える 3

3

上記のコードを 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))
    }
}
于 2015-05-09T21:22:33.213 に答える