【问题标题】:drawrect Vs layoutsubviews - NSView - Cocoa touchdrawrect 与 layoutsubviews - NSView - Cocoa touch
【发布时间】:2010-09-24 17:28:26
【问题描述】:

我找不到合适的答案来解释这两个函数之间的区别。 每个人什么时候被调用,一个与另一个有何不同?

例如,我不能在 drawrect 中布局我的视图吗?

谢谢

【问题讨论】:

    标签: iphone cocoa-touch nsview drawrect


    【解决方案1】:

    -layoutSubviews-layoutIfNeeded 调用,如果设置了“需要布局”标志(使用-setNeedsLayout,或在视图边界更改时自动调用)。用它来定位你的视图 [编辑:用它来定位子视图]。

    如果设置了“需要显示”标志(使用-setNeedsDisplay,或者如果设置了view.contentMode = UIViewContentModeRedraw,则自动调用)从-displayIfNeeded 调用-drawRect:

    -layoutIfNeeded-displayIfNeeded 在将内容绘制到屏幕之前由 UIKit/CoreAnimation 自动调用;你很少需要直接打电话给他们。

    您可以将您的子视图定位在-drawRect:(您甚至可以添加子视图!),但这是不明智的:

    • 默认情况下,-setNeedsDisplay 不会在边界更改时自动调用。
    • 实现-drawRect: 会降低性能(UIKit/CoreAnimation 必须为您创建一个支持位图的图形上下文);仅当您需要执行自定义绘图时才这样做。
    • 您需要重绘-drawRect: 中的视图。画画很贵。移动视图很便宜。
    • UIKit/CoreAnimation 可能会先进行布局传递,然后再进行绘图传递。 CoreAnimation 可以使用布局信息来决定需要绘制哪些视图(例如,它可以忽略被不透明子视图、屏幕外视图或 clipsToBounds=YES 视图边界之外的子视图遮挡的视图;或者它只能绘制大视图)。如果您在绘制过程中移动视图,CoreAnimation 可能无法正确绘制它们。

    编辑:还有一些我醒着的细节:

    “显示”和“绘制”有什么区别?显示由-[CALayer display]完成;默认实现是(大约)

    • 如果层的代理响应-displayLayer:,调用[self.delegate displayLayer:self]-displayLayer: 应该将 layer.content 设置为(例如)一个 CGImage,
    • 否则,如果layer的delegate响应-drawLayer:inContext:,设置bitmap-backed context,调用[self.delegate drawLayer:self inContext:context],并将输出保存到layer.content(输出实际上是一个CABackingStore,推测是私有API )
    • 否则,请勿更改layer.content

    视图是层的委托,所以你可以实现-[MyView displayLayer:],并做一些有趣的事情,比如

    • self.layer.contents = (id)([UIImage imageNamed:@"foo"].CGImage)(大致就是 UIImageView 的作用)
    • 无操作,以防止任何“绘图”。如果您已将其子类化,这可能会很有用,例如UIToolbar 并想给它一个透明的背景。 (这也会阻止创建 CGContext/CABackingStore。)
    • 在不影响性能的情况下移动子视图(但由于上述原因,这仍然不是一个好主意)。

    【讨论】:

      【解决方案2】:

      也许我没有所有的答案,但我可以告诉你: - 当视图框架改变时调用 layoutSubviews - 调用 setNeedDisplay 时调用 drawRect

      大多数时候你不会使用 layoutSubviews。

      可能还有其他情况,但它可以给你第一条答案^^

      祝你好运

      【讨论】:

      • 请详细说明您的断言“大多数时候您不会使用 layoutSubviews。”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      相关资源
      最近更新 更多