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
}
}
我有两个视图 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
}
}