如何观察 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
或类似名称)。
【讨论】:
这适用于 iosUIView
s 吗?文档仅显示它支持 Mac OS 中的 NSView
。
我在文档中没有看到任何对通知的引用,所以我认为可能没有。看起来很直观,iOS UIView
在没有您的程序代码支持的情况下更改其框架的可能性要小得多。
iOS 似乎比 Mac OS 更少依赖 KVO 和通知之类的东西,我认为因为它们相当“重量级”并且需要更多的内存和更多的 CPU 马力。我的猜测是,Apple 在实现 iOS 视图时决定放弃该功能。
效果很好。过了一段时间,我发现通知对象是整个 NSView,而不仅仅是 NSRect。谢谢!
在 XCode 11 (Swift 5) 中,通知名称为NSView.frameDidChangeNotification
以上是关于如何观察 NSView 帧变化?的主要内容,如果未能解决你的问题,请参考以下文章
如何实现一个 Firebase 监听器来观察数据库的实时变化
观察 NSManagedObject 属性的变化:如何避免循环?