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