为什么drawRect:在没有调用[super drawrect:rect]的情况下工作?

时间:2014-10-21 05:33:52

标签: ios core-graphics

我正在覆盖drawRect:在我的一个视图中,它甚至可以在不调用[super drawrect:rect]的情况下工作。这是如何运作的?

- (void)drawRect:(CGRect)rect{  
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(context, kCGBlendModeDestinationOver);
    [[UIColor clearColor] setFill];
    UIRectFill(CGRectMake(0,0,100,100));
}

4 个答案:

答案 0 :(得分:21)

来自文档:

  

"此方法的默认实现不执行任何操作。子类   使用Core Graphics和UIKit等技术来绘制他们的   view的内容应覆盖此方法并实现其绘图   在那里编码"

同样来自文档..

  

"如果您直接将UIView子类化,则执行此方法   不需要打电话给超级。但是,如果你是一个子类   不同的视图类,你应该在你的某个时刻调用super   。实施"

Link to the documentation

我假设,你的超级班是UIView。因此,即使没有调用[super drawrect:rect],它也能工作。因为drawRect:因为UIView什么都不做。因此,无论你是否调用[super drawrect:rect],它都没有区别。

答案 1 :(得分:5)

基本上,它起作用是因为为绘图等设置图形上下文的机制不存在于UIView -drawRect:的实现中(它是空的)。

那个机器确实住在某个地方,当然,让我们假装每个UIView都有一些像这样的内部方法 - 方法,功能和属性的名称是为了保护无辜者而发明的:

- (void)_drawRectInternal:(CGRect)rect
{
    // Setup for drawing this view.
    _UIGraphicsContextPushTransform(self._computedTransform);

    // Call this object's implementation of draw (may be empty, or overridden).
    [self drawRect:rect];

    // draw our subviews: 
    for (UIView * subview in [self subviews]) {
        [subview _drawRectInternal:rect];
    }

    // Teardown for this view.
    _UIGraphicsContextPopTransform();
}

这是一种更简洁的方法来构建框架,而不是依赖子类化程序在公共覆盖中做正确的事情,如果错误将会导致非常令人费解的不良行为。 (这根本不可能,因为平局可能需要设置和拆除步骤。)

答案 2 :(得分:-1)

谢谢..没有必要调用super,因为这里的超类是UIView,其drawRect:什么都不做。

一般情况下,如果我们想要召回drawRect进行绘图,我们会调用setNeedDisplay。

答案 3 :(得分:-1)

我确定没有调用[super drawrect:rect]就不能使用subview。如果你需要保留superview的绘图,你必须在子视图的drawrect:rect中添加[super drawrect:rect],或者你将替换图纸。