
[英]Auto Layout programmatically (NSLayoutConstraint): center inner view in outer view and constrain to min(width, height)
[英]NSLayoutConstraint for setting Min and Max view width
我想在 AppKit 中实现的(不是在 SwiftUI 中) : [GIF] (在 SwiftUI 中的示例)
NSWindow
最大宽度不应限制为NSTextField
最大宽度。NSWindow
最小宽度应限制为NSTextField
最小宽度。NSTextField
需要有这些参数: [ min width: 200
, max width: 400
]我曾多次尝试在 AppKit 中实现这种行为。 这几天我一直在尝试这样做,但它不起作用。 [图片] [GIF]
我试图在前导/尾随约束上设置低优先级。
这部分解决了这种情况。 我能够正常更改 window 的大小,但 window 的大小不限于NSTextField
的最小大小。 [GIF]
这里要注意的重要一点是,您只希望低优先级约束成为一种方式。 也就是说,你不想要这样的东西:
// throughout the answer, I use "tf" for the text field, and "view" for its superview
let weakLeadingConstraint = tf.leadingAnchor.constraint(equalTo: view.leadingAnchor)
let weakTrailingConstraint = tf.trailingAnchor.constraint(equalTo: view.trailingAnchor)
weakLeadingConstraint.priority = .dragThatCannotResizeWindow
weakTrailingConstraint.priority = .dragThatCannotResizeWindow
因为当 window 被调整大小时,这些约束会被打破,因此允许 window 调整大小到任何宽度,其中前导和尾随锚点与文本字段的锚点“不相等”。
相反,低优先级约束应该是 >= 或 <= 约束。 将 2 个等式约束视为以下 4 个不等式约束:
tf.leading <= view.leading
tf.trailing >= view.trailing
tf.leading >= view.leading
tf.trailing <= view.trailing
当您调整 window 的大小时,它是您想要中断的前 2 个,而最后 2 个(表示文本字段应始终在窗口内)保持不变。
其他约束非常简单,所以我将在这里展示整个代码:
tf.translatesAutoresizingMaskIntoConstraints = false
let weakLeadingConstraint = tf.leadingAnchor.constraint(lessThanOrEqualTo: view.leadingAnchor)
let weakTrailingConstraint = tf.trailingAnchor.constraint(greaterThanOrEqualTo: view.trailingAnchor)
weakLeadingConstraint.priority = .dragThatCannotResizeWindow
weakTrailingConstraint.priority = .dragThatCannotResizeWindow
NSLayoutConstraint.activate([
tf.centerXAnchor.constraint(equalTo: view.centerXAnchor),
tf.centerYAnchor.constraint(equalTo: view.centerYAnchor),
tf.leadingAnchor.constraint(greaterThanOrEqualTo: view.leadingAnchor),
tf.trailingAnchor.constraint(lessThanOrEqualTo: view.trailingAnchor),
weakLeadingConstraint,
weakTrailingConstraint,
tf.widthAnchor.constraint(greaterThanOrEqualToConstant: 200),
tf.widthAnchor.constraint(lessThanOrEqualToConstant: 400),
])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.