macOS NSView - 如何为左侧和右侧提供动态边距

macOS NSView - How to give dynamic margin to left and right sides

我有两个视图 A(View Controller 的视图),B(是 NSView 和 A 的子视图)。视图 B 固定到视图 A 的顶部、尾部、底部和前导。当我拖动 window 时,视图 B 会根据自动布局约束增长。这很好。在某一时刻,我希望视图 B 停止增长并在视图 A 和 B 之间的前导和尾随处提供边距。

我确实围绕 widthAnchor 进行了调整,所以边距仅在右侧(尾部)增长,这很明显。我怎样才能给左边(前导)边同样的边距。

B.widthAnchor.constraint(lessThanOrEqualToConstant: 1000)

代码:

    override func viewDidLoad() {
    super.viewDidLoad()
    view.translatesAutoresizingMaskIntoConstraints = false
    
    let B = CustomNSView(frame: .zero)
    B.translatesAutoresizingMaskIntoConstraints = false
    //detailView.autoresizingMask = [.width, .maxXMargin, .maxYMargin]
   // detailView.frame.size.width = 600
    view.addSubview(B)
    
    NSLayoutConstraint.activate([
        B.topAnchor.constraint(equalTo: view.topAnchor),
        //B.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        //B.widthAnchor.constraint(lessThanOrEqualToConstant: 1000),
        B.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        B.leadingAnchor.constraint(equalTo: view.leadingAnchor),
    ])
}

感谢您的意见, 谢谢

一种方法是保存前导和尾随布局约束,然后在视图超过 B 的最大宽度时更改它们的常量:

var bLeading: NSLayoutConstraint?
var bTrailing: NSLayoutConstraint?
var bMaxWidth: CGFloat = 1000

override func viewDidLoad() {
    super.viewDidLoad()
    
    let b = CustomNSView()
    view.addSubview(b)
    
    b.translatesAutoresizingMaskIntoConstraints = false
    b.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    b.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
    
    bLeading = b.leadingAnchor.constraint(equalTo: view.leadingAnchor)
    bTrailing = b.trailingAnchor.constraint(equalTo: view.trailingAnchor)
    
    bLeading?.isActive = true
    bTrailing?.isActive = true
}

override func viewWillLayout() {
    let margin = view.bounds.width - bMaxWidth
    
    if margin > 0 {
        bLeading?.constant = margin
        bTrailing?.constant = -margin
    } else {
        bLeading?.constant = 0
        bTrailing?.constant = 0
    }
}