我找不到一个像样的答案来解释这两个功能之间的区别。每个人什么时候被叫到,一个人与另一个人有何不同?
例如,我不能只在 drawrect 中布局我的视图吗?
谢谢
我找不到一个像样的答案来解释这两个功能之间的区别。每个人什么时候被叫到,一个人与另一个人有何不同?
例如,我不能只在 drawrect 中布局我的视图吗?
谢谢
-layoutSubviews
-layoutIfNeeded
如果设置了“需要布局”标志(使用-setNeedsLayout
, 或在视图边界更改时自动),则调用。用它来定位你的视图[编辑:用它来定位子视图]。
-drawRect:
-displayIfNeeded
如果设置了“显示需要”标志(使用-setNeedsDisplay
,或者如果您设置了 ,则自动调用view.contentMode = UIViewContentModeRedraw
)。
两者都由 UIKit/CoreAnimation 在绘制到屏幕之前自动调用-layoutIfNeeded
;-displayIfNeeded
你很少需要直接打电话给他们。
你可以定位你的子视图-drawRect:
(你甚至可以添加子视图!),但这是不明智的:
-setNeedsDisplay
不会在边界更改时自动调用。-drawRect:
会降低性能(UIKit/CoreAnimation 必须为您创建一个位图支持的图形上下文);仅当您需要执行自定义绘图时才这样做。-drawRect:
。画画很贵。移动视图很便宜。编辑:当我醒着时还有更多细节:
“显示”和“绘制”有什么区别?显示由-[CALayer display]
; 默认实现是(大约)
-displayLayer:
,调用 [self.delegate displayLayer:self]
。-displayLayer:
应该设置layer.content
为(例如)一个CGImage,-drawLayer:inContext:
,设置一个位图支持的上下文,调用[self.delegate drawLayer:self inContext:context]
,并将输出保存到layer.content
(输出实际上是一个 CABackingStore,大概是一个私有 API)layer.content
。视图是层的委托,所以你可以实现-[MyView displayLayer:]
,并做一些有趣的事情,比如
self.layer.contents = (id)([UIImage imageNamed:@"foo"].CGImage)
(这大致是 UIImageView 所做的)也许我没有所有的答案,但我可以说: - layoutSubviews 在视图框架发生变化时被调用 - drawRect 在 setNeedDisplay 被调用时被调用
大多数时候你不会使用 layoutSubviews。
可能还有其他情况,但它可以给你第一个答案^^
祝你好运