如何观察 NSView 帧变化?

Posted

技术标签:

【中文标题】如何观察 NSView 帧变化?【英文标题】:How to observe NSView frame change? 【发布时间】:2017-08-29 15:58:14 【问题描述】:

我有一个 NSView,如果框架发生变化,我需要注意它。

class CustomView: NSView 

    override var frame: NSRect 

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

但是,如果调整了 superView 框架的大小,我只会收到此“通知”。

如果我在 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 函数根本没有反应。虽然帧大小改变了。感谢您的建议。

【问题讨论】:

Is there a UIView resize event?的可能重复 试试bounds... @sCha 和bounds一样 【参考方案1】:

两步:

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

    此时,您应该可以使用 NSNotificationCenter 观察视图的 frameDidChangeNotification(如果使用 Swift 3,则为 NSNotification.Name.NSViewFrameDidChange 或类似名称)。

【讨论】:

这适用于 ios UIViews 吗?文档仅显示它支持 Mac OS 中的 NSView 我在文档中没有看到任何对通知的引用,所以我认为可能没有。看起来很直观,iOS UIView 在没有您的程序代码支持的情况下更改其框架的可能性要小得多。 iOS 似乎比 Mac OS 更少依赖 KVO 和通知之类的东西,我认为因为它们相当“重量级”并且需要更多的内存和更多的 CPU 马力。我的猜测是,Apple 在实现 iOS 视图时决定放弃该功能。 效果很好。过了一段时间,我发现通知对象是整个 NSView,而不仅仅是 NSRect。谢谢! 在 XCode 11 (Swift 5) 中,通知名称为NSView.frameDidChangeNotification

以上是关于如何观察 NSView 帧变化?的主要内容,如果未能解决你的问题,请参考以下文章

如何观察所有对象属性的变化?

如何实现一个 Firebase 监听器来观察数据库的实时变化

如何观察 Firebase 实时数据库的变化

观察 NSManagedObject 属性的变化:如何避免循环?

如何使用 RxSwift 观察 UITextField 中的文本变化?

如何使用 Nuxt 和 asyncData 观察路由变化