Iphone drawrect Vs LayoutSubView-NSView-Cocoa touch
我找不到合适的答案来解释这两个函数之间的区别。 每个人什么时候都会接到电话,一个和另一个有何不同 例如,我不能在drawrect中布局我的视图吗Iphone drawrect Vs LayoutSubView-NSView-Cocoa touch,iphone,cocoa-touch,nsview,drawrect,Iphone,Cocoa Touch,Nsview,Drawrect,我找不到合适的答案来解释这两个函数之间的区别。 每个人什么时候都会接到电话,一个和另一个有何不同 例如,我不能在drawrect中布局我的视图吗 谢谢也许我没有所有的答案,但我可以告诉你: -更改图幅时调用layoutSubviews -调用setNeedDisplay时调用drawRect 大多数情况下,您不会使用LayoutSubView 可能还有其他情况,但它可以给你一个第一个答案^^ 祝您好运-layoutSubviews是从-layoutifneedd调用的,如果设置了“需要布局”标志
谢谢也许我没有所有的答案,但我可以告诉你: -更改图幅时调用layoutSubviews -调用setNeedDisplay时调用drawRect 大多数情况下,您不会使用LayoutSubView 可能还有其他情况,但它可以给你一个第一个答案^^
祝您好运
-layoutSubviews
是从-layoutifneedd
调用的,如果设置了“需要布局”标志(使用-setNeedsLayout
,或者在视图边界更改时自动调用)。使用它定位视图[编辑:使用它定位子视图]
如果设置了“需要显示”标志(使用-setNeedsDisplay
,或者如果设置了view.contentMode=UIViewContentModeRedraw
),则从-display
调用
UIKit/CoreAnimation在将事物绘制到屏幕之前自动调用-layoutifneed
和-displayIfNeeded
;你很少需要直接给他们打电话
您可以在-drawRect:
中定位子视图(甚至可以添加子视图!),但这是不明智的:
- 默认情况下,边界更改时不会自动调用
-setNeedsDisplay
- 实现
-drawRect:
会降低性能(UIKit/CoreAnimation必须为您创建位图支持的图形上下文);仅当需要执行自定义图形时才执行此操作
- 您需要在
-drawRect:
中重新绘制视图。画画很贵。移动视图很便宜
- UIKit/CoreAnimation可能先执行布局过程,然后执行绘图过程。CoreAnimation可以使用布局信息来决定需要绘制哪些视图(例如,它可以忽略被不透明子视图、屏幕外视图或clipsToBounds=YES视图边界外的子视图遮挡的视图;或者它只能绘制大视图的子矩形)。如果在绘制过程中移动视图,CoreAnimation可能无法正确绘制视图
编辑:以及我醒着时的更多细节:
“显示”和“绘制”有什么区别?显示由-[CALayer display]
完成;默认实现是(大约)
- 如果层的代理响应
-displayLayer:
,请调用[self.delegate displayLayer:self]
<代码>-显示层:
应该设置层。内容
为(例如)CGImage
-drawLayer:inContext:
,则设置位图支持的上下文,调用[self.delegate drawLayer:self inContext:context]
,并将输出保存到层.content
(输出实际上是一个CABackingStore,它可能是一个私有API)-[MyView displayLayer:
,并执行以下有趣的操作
(这大致就是UIImageView的功能)self.layer.contents=(id)([UIImage-imagename:@“foo”].CGImage)
- 无操作,以防止任何“绘图”。如果您已经对UIToolbar进行了子类化,并希望为其提供透明的背景,那么这可能很有用。(这也会阻止创建CGContext/CABackingStore。)
- 在不影响性能的情况下移动子视图(但出于上述原因,这仍然不是一个好主意)