如何观察NSView框架的变化?

Jos*_*ard 2 macos frame nsview ios swift

我有一个NSView,如果框架改变我需要注意.

class CustomView: NSView {

    override var frame: NSRect {

        didSet {
            Swift.print("changed frame: \(self.frame)")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如果调整superView框架的大小,我只会得到这个"notifikation".

如果我在NSView类中执行类似的操作:

NotificationCenter.default.addObserver(forName:  Notification.Name(rawValue: "changeOwnSize"), object: nil, queue: nil) { notification in

          let newSize = NSSize(width: self.frame.width / 2, height: self.frame.height)
          self.setFrameSize(newSize)
}
Run Code Online (Sandbox Code Playgroud)

didSet功能根本没有反应.虽然框架大小已更改.谢谢你的建议.

Cha*_*tka 9

两个步骤:

  1. 在某些时候,将视图的postsFrameChangedNotifications属性设置为true.

  2. 此时,您应该能够观察视图的frameDidChangeNotification使用NSNotificationCenter(如果使用Swift 3,它NSNotification.Name.NSViewFrameDidChange或类似的东西).

  • 在 XCode 11 (Swift 5) 中,通知名称为 `NSView.frameDidChangeNotification` (2认同)