我正在覆盖drawRect:在我的一个视图中,它甚至可以在不调用[super drawrect:rect]的情况下工作。这是如何运作的?
- (void)drawRect:(CGRect)rect{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetBlendMode(context, kCGBlendModeDestinationOver);
[[UIColor clearColor] setFill];
UIRectFill(CGRectMake(0,0,100,100));
}
答案 0 :(得分:21)
来自文档:
"此方法的默认实现不执行任何操作。子类 使用Core Graphics和UIKit等技术来绘制他们的 view的内容应覆盖此方法并实现其绘图 在那里编码"
同样来自文档..
"如果您直接将UIView子类化,则执行此方法 不需要打电话给超级。但是,如果你是一个子类 不同的视图类,你应该在你的某个时刻调用super 。实施"
我假设,你的超级班是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],或者你将替换图纸。