2017-08-29 95 views
1

我有一个NSView我需要注意如果帧改变。如何观察NSView框架更改?

class CustomView: NSView { 

    override var frame: NSRect { 

     didSet { 
      Swift.print("changed frame: \(self.frame)") 
     } 
    } 
} 

但是,如果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) 
} 

didSet功能doesn't反应都没有。尽管帧大小已更改。感谢您的任何建议。

+0

的可能的复制[有一个UIView调整事件?(https://stackoverflow.com/questions/4000664/is-there-a-uiview-resize-event) – GIJOW

+0

尝试'bounds' .. – sCha

+0

@sCha与'bounds'相同 –

回答

3

两个步骤:

  1. 在某些时候,你的观点的postsFrameChangedNotifications属性设置为true

  2. 在这一点上,你应该能够使用NSNotificationCenter(如果使用Swift 3,它是NSNotification.Name.NSViewFrameDidChange或类似的东西)观察视图的frameDidChangeNotification

+0

这对于iOS'UIView是否适用?文档只显示它支持Mac OS中的'NSView'。 –

+0

我没有在文档中看到任何对通知的引用,所以我可能会认为不是。看起来很直观,一个iOS'UIView'在没有你的程序代码的情况下不会改变它的框架。 –

+0

iOS似乎依赖于像KVO和通知比Mac OS更少,我认为,因为它们相当“重量级”,并需要更多的内存和更多的CPU的马力。我的猜测是,苹果决定在实施iOS视图时放弃该功能。 –