我找不到一个像样的答案来解释这两个函数之间的区别。 什么时候每个人都会打电话,以及一个人和另一个人有什么不同?drawrect vs layoutsubviews - NSView - 可可触摸
例如,我不能只是布局我的意见里面drawrect?
感谢
我找不到一个像样的答案来解释这两个函数之间的区别。 什么时候每个人都会打电话,以及一个人和另一个人有什么不同?drawrect vs layoutsubviews - NSView - 可可触摸
例如,我不能只是布局我的意见里面drawrect?
感谢
-layoutSubviews
是,如果已经设置了“需要的布局”(使用-setNeedsLayout
从-layoutIfNeeded
叫,或者当视图边界改变时自动)。用它来定位
您的看法
[编辑:用它来定位子视图]。
-drawRect:
从-displayIfNeeded
如果“需要显示”标志(使用-setNeedsDisplay
,或如果设置view.contentMode = UIViewContentModeRedraw
自动)设定调用。
-layoutIfNeeded
和-displayIfNeeded
都是在UIKit/CoreAnimation自动调用之前绘制屏幕;你很少需要直接打电话给他们。
可以在-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做大致的)也许我不知道所有的答案,但我可以说你是: - 当setNeedDisplay被称为
的drawRect被称为 - 当视图框改变 layoutSubviews被称为大多数时候你不会使用layoutSubviews。
可能还有其他案件,但它可以给你一个第一块答案^^
好运的
请给出更详细的在你的说法,“大部分的时间你不会用layoutSubviews。” – 2013-08-29 03:40:18
伟大的答案。谢谢! – Idan 2010-09-25 11:39:14