繁体   English   中英

NSLayoutConstraint 用于设置最小和最大视图宽度

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM