2017-08-29 122 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視圖時放棄該功能。 –