【发布时间】:2010-09-24 17:28:26
【问题描述】:
我找不到合适的答案来解释这两个函数之间的区别。 每个人什么时候被调用,一个与另一个有何不同?
例如,我不能在 drawrect 中布局我的视图吗?
谢谢
【问题讨论】:
标签: iphone cocoa-touch nsview drawrect
我找不到合适的答案来解释这两个函数之间的区别。 每个人什么时候被调用,一个与另一个有何不同?
例如,我不能在 drawrect 中布局我的视图吗?
谢谢
【问题讨论】:
标签: iphone cocoa-touch nsview drawrect
-layoutSubviews 从-layoutIfNeeded 调用,如果设置了“需要布局”标志(使用-setNeedsLayout,或在视图边界更改时自动调用)。用它来定位你的视图 [编辑:用它来定位子视图]。
如果设置了“需要显示”标志(使用-setNeedsDisplay,或者如果设置了view.contentMode = UIViewContentModeRedraw,则自动调用)从-displayIfNeeded 调用-drawRect:。
-layoutIfNeeded 和 -displayIfNeeded 在将内容绘制到屏幕之前由 UIKit/CoreAnimation 自动调用;你很少需要直接打电话给他们。
您可以将您的子视图定位在-drawRect:(您甚至可以添加子视图!),但这是不明智的:
-setNeedsDisplay 不会在边界更改时自动调用。-drawRect: 会降低性能(UIKit/CoreAnimation 必须为您创建一个支持位图的图形上下文);仅当您需要执行自定义绘图时才这样做。-drawRect: 中的视图。画画很贵。移动视图很便宜。编辑:还有一些我醒着的细节:
“显示”和“绘制”有什么区别?显示由-[CALayer display]完成;默认实现是(大约)
-displayLayer:,调用[self.delegate displayLayer:self]。 -displayLayer: 应该将 layer.content 设置为(例如)一个 CGImage,-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 的作用)【讨论】:
也许我没有所有的答案,但我可以告诉你: - 当视图框架改变时调用 layoutSubviews - 调用 setNeedDisplay 时调用 drawRect
大多数时候你不会使用 layoutSubviews。
可能还有其他情况,但它可以给你第一条答案^^
祝你好运
【讨论】: