我想在 AppKit 中實作的(不是在 SwiftUI 中):[GIF] (在 SwiftUI 中的示例)
NSWindow
最大寬度不應限于NSTextField
最大寬度。NSWindow
最小寬度應限制為最小NSTextField
寬度。NSTextField
需要有這些引數:[最小寬度:200
,最大寬度:400
]
我曾多次嘗試在 AppKit 中實作這種行為。這幾天我一直在嘗試這樣做,但它不起作用。 [圖片] [GIF]
我試圖在前導/尾隨約束上設定低優先級。
這部分解決了這種情況。我能夠正常更改視窗的大小,但視窗大小不限于NSTextField
.
[GIF]
uj5u.com熱心網友回復:
這里要注意的重要一點是,您只希望低優先級約束成為一種方式。也就是說,你不想要這樣的東西:
// 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
因為在調整視窗大小時這些約束會中斷,因此允許視窗調整大小到前導和尾隨錨點“不等于”文本欄位的任何寬度。
相反,低優先級約束應該是 >= 或 <= 約束。將 2 個等式約束視為以下 4 個不等式約束:
tf.leading <= view.leading
tf.trailing >= view.trailing
tf.leading >= view.leading
tf.trailing <= view.trailing
這是您要中斷的前 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),
])
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/507547.html
標籤:迅速 可可 西布 nslayoutconstraint 应用套件