【问题标题】:Is it possible to observe -visibleRect是否可以观察 -visibleRect
【发布时间】:2012-05-26 05:45:47
【问题描述】:

我想在某个NSView- (NSRect)visibleRect 更改时收到通知,因为我想根据可见的矩形做一些花哨的子视图布局。坦率地说,现在我很难过; -visibleRect 不会发出 KVO 通知(这是有道理的),而且如果不显式调用 -visibleRect,似乎没有办法找出可见矩形是否发生变化。

这有可能吗? (或者这是一个可怕的想法?)

【问题讨论】:

    标签: objective-c cocoa osx-lion nsview


    【解决方案1】:

    我认为您可以覆盖-[NSView updateTrackingAreas] 或监听NSViewDidUpdateTrackingAreasNotification。这些可能发生在更多场合,而不仅仅是可见矩形的变化,但它们应该发生在可见矩形的任何变化上。我想。

    也就是说,这可能是一个糟糕的主意。很难知道。 :)

    【讨论】:

    • 好问题和答案。这个答案帮助我解决了我面临的另一个问题,但我也有这个问题。对于这个问题,我会投票赞成这个答案,但不接受。
    • updateTrackingAreas 的文档说“当视图的几何形状发生变化从而需要重新计算其跟踪区域时自动调用。”但尚不清楚视图的几何形状意味着什么。有一个关于查看几何的主题,但只解释了边界和框架。它确实解释了 visibleRect 但它没有将其称为视图的几何图形。
    • 我猜当框架、边界、可见矩形或视图上的转换随着#macdev irc 频道上的某个人解释而发生变化时调用它。
    【解决方案2】:

    10.5 后的另一个选项是 -viewWillDraw 方法,它在视图(及其子视图)被绘制之前被调用。您可以在调用 [super viewWillDraw] 之前获取视图的可见矩形并执行布局。

    【讨论】:

      【解决方案3】:

      Ken 关于监听跟踪区域变化的建议感觉很老套,但似乎有效,尽管它们仅在调整大小完成后才会触发。如果您像我一样在调整大小的过程中需要更新,它会覆盖 -[NSView resizeWithOldSuperviewSize:] 来实现这一点

      【讨论】:

        【解决方案4】:

        至少对于 NSScrollView,adjustTrackingArea 解决方案在 Mojave 中似乎不可行。 Mojave 在滚动 NSScrollView 时似乎并不总是调用 adjustTrackingArea。 尚未测试其他操作系统版本、其他视图类型。

        【讨论】:

          猜你喜欢
          • 2022-01-16
          • 1970-01-01
          • 1970-01-01
          • 2011-06-17
          • 2012-08-18
          • 1970-01-01
          • 1970-01-01
          • 2016-03-02
          • 1970-01-01
          相关资源
          最近更新 更多