我使用的是 macOS 15.0.1 并使用 Xcode 16.0,这打破了我现有应用程序中的 NSView 对齐。主要问题是,子级
NSView
在 NSView
中获取与父级 override func draw(_ dirtyRect: NSRect)
一样的帧大小,而不是 100:100
我将 Swift 语言版本 6 从 5 个相同问题更改为 6。我也创建了新项目,但新旧项目中存在同样的问题。仅当使用
func draw(_ dirtyRect: NSRect)
时才会出现问题,如果我在子视图中使用 wantsLayer=true
而不是 draw(_ dirtyRect: NSRect)
则效果很好。
`
如何解决?
private class ViewA: NSView {
override func draw(_ dirtyRect: NSRect) {
print("ViewA: \(dirtyRect)")
NSColor.systemBlue.set()
dirtyRect.fill()
}
}
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.wantsLayer = true
view.layer?.backgroundColor = NSColor.white.cgColor
let v1 = ViewA()
view.addSubview(v1)
v1.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
v1.centerXAnchor.constraint(equalTo: view.centerXAnchor),
v1.centerYAnchor.constraint(equalTo: view.centerYAnchor),
v1.heightAnchor.constraint(equalToConstant: 100),
v1.widthAnchor.constraint(equalToConstant: 100)
])
}
override func viewDidLayout() {
super.viewDidLayout()
print("VC.view = \(view.frame)")
}
}
电流输出:
预期输出:
let v1 = NSView()
v1.wantsLayer = true
v1.layer?.backgroundColor = NSColor.systemBlue.cgColor