繁体   English   中英

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

[英]Why does drawRect: work without calling [super drawrect:rect]?

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

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

从文档:

“此方法的默认实现不执行任何操作。使用Core Graphics和UIKit等技术绘制视图内容的子类应覆盖此方法并在其中实现其绘图代码”

也来自文档..

“如果直接将UIView子类化,那么这个方法的实现不需要调用super。但是,如果你是子类化不同的视图类,你应该在实现的某个时候调用super。”

链接到文档

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

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

那个机器确实住在某个地方,当然,让我们假装每个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();
}

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

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

通常,如果我们想要调用drawRect进行绘制,我们调用setNeedDisplay。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM