2012-01-14 75 views
1

看起来在UIView上调用[self setNeedsDisplay]不会导致 [self.layer setNeedsDisplay]。它是正常的,如果我重写setNeedsDisplay如下:UIView setNeedsDisplay调用CALayer的setNeedsDisplay?

- (void)setNeedsDisplay { 
    [super setNeedsDisplay]; 
    [self.layer setNeedsDisplay]; 
} 

这会不会给我惹麻烦?也许有更好的办法? 谢谢

+0

你为什么认为你需要这个? – 2012-01-14 22:24:39

+0

我想调用'[myView setNeedsDisplay]'方法,而不必调用'[myView.layer setNeedsDisplay]'。我在UIView子类中设置了一个精心制作的CALayer层次结构。 – Ana 2012-01-14 22:41:51

+0

为什么你需要调用'[CALayer setNeedsDisplay]'?调用'[UIView setNeedsDisplay]'会导致它在运行循环结束时触发它的'-drawRect:'。你还想做什么? – 2012-01-14 22:51:58

回答

1

我不明白为什么它会让你陷入困境。 setNeedsDisplay/setNeedsLayout只是标记视图/图层需要显示/布局。它会在下次运行循环时执行绘图。

虽然在视图上调用它并不会导致它在图层上发生,但我很惊讶,因为毕竟UIView及其关联的CALayer是非常紧密集成的。

因此,总体而言,如果您发现它不适合您,只需在视图上拨打setNeedsDisplay即可获得解决方案。我不明白它是如何伤害任何东西的。

+1

当drawRect:实现时(即使方法是空的并且什么都不做),UIView只在其底层CALayer上调用setNeedsDisplay。这告诉UIView的setNeedsDisplay它的图层也有一些绘图要完成。另一种自动调用图层的setNeedsDisplay的方法是将图层的标志needsDisplayOnBoundsChange设置为true,只要视图的边界发生变化(会自动更改图层的边界),这会触发setNeedsDisplay。但要回答你的问题,如果你不覆盖drawRect,你所做的很好,否则它是多余的。 – 2013-05-09 06:43:33

+0

Thanks @ Mr.T,您的评论回答了我的问题。您应该将其作为单独的答案发布。 – titaniumdecoy 2013-06-17 23:09:37

+0

谢谢@titaniumdecoy。我很高兴我能帮上忙! – 2013-06-18 01:19:09

3

我发表了这个评论到另一个答案,但这可能会对其他人有所帮助。

drawRect:被实现时(即使该方法是空的并且什么都不做),UIView只在其底层CALayer上调用setNeedsDisplay。这告诉UIView的setNeedsDisplay它的图层也有一些绘图要完成。

另一种方式来获得该层的setNeedsDisplay将被自动调就是将图层的标志needsDisplayOnBoundsChange设置为true,这将引发setNeedsDisplay每当视图边界的变化(这会自动更改层的边界)。但要回答你的问题,如果你没有覆盖drawRect:,你所做的很好,否则它是多余的。

相关问题