drawrect Vs layoutsubviews - NSView - Cocoa touch

Ida*_*dan 18 iphone cocoa-touch nsview drawrect

我找不到一个体面的答案来解释我这两个功能之间的区别.每个人什么时候被召唤,一个人与另一个人有什么不同?

例如,我不能只是将我的视图布局在drawrect中吗?

谢谢

tc.*_*tc. 57

-layoutSubviews-layoutIfNeeded如果设置了"layout needed"标志(使用-setNeedsLayout,或者在视图边界发生变化时自动调用),则调用from .用它来定位你的视图 [ 编辑:用它来定位子视图 ].

-drawRect:-displayIfNeeded如果设置了"需要显示"标志(使用-setNeedsDisplay,或者如果设置则自动设置view.contentMode = UIViewContentModeRedraw),则调用.

这两个-layoutIfNeeded-displayIfNeeded的事情被吸引到屏幕前,会自动的UIKit/CoreAnimation调用; 你很少需要直接打电话给他们.

您可以在子视图中定位-drawRect:(甚至可以添加子视图!),但这是不明智的:

  • 默认情况下,-setNeedsDisplay不会在边界更改时自动调用.
  • 实现-drawRect:降低了性能(UIKit/CoreAnimation必须为您创建一个支持位图的图形上下文); 只有在需要执行自定义绘图时才这样做.
  • 您需要重新绘制视图-drawRect:.绘图很贵.移动视图很便宜.
  • UIKit/CoreAnimation可能会进行布局传递,然后是绘图传递.CoreAnimation可以使用布局信息来决定需要绘制哪些视图(例如,它可以忽略由不透明子视图,屏幕外视图或者在clipsToBounds = YES视图范围之外的子视图遮挡的视图;或者它只能绘制一个子视图大观).如果在绘图过程中移动视图,CoreAnimation可能无法正确绘制它们.

编辑:当我醒来时还有一些细节:

"显示"和"抽奖"有什么区别?显示是通过-[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的作用相同)
  • 没有操作,以防止任何"绘图".如果您已经将子类化为UIToolbar并希望为其提供透明背景,那么这可能很有用.(这也会阻止创建CGContext/CABackingStore.)
  • 在没有性能损失的情况下移动子视图(但由于上述原因,它仍然不是一个好主意).