在Objective-C(iOS)中覆盖drawRect:(CGRect)rect?

时间:2014-05-31 00:10:02

标签: ios objective-c uiview bounds

在制作简单的iOS应用程序时,我覆盖了drawRect:(CGRect)rect方法。在我正在阅读的书中,边界是使用self.bounds定义的,如下所示:

- (void)drawRect:(CGRect)rect
{
    CGRect bounds = self.bounds;

    //rest of drawing code here
}

我注意到在本书中,该方法的其余部分甚至没有使用rect参数并且工作正常。我假设rect会在视图中设置边界,所以我尝试了以下内容:

- (void)drawRect:(CGRect)rect
{
    CGRect bounds = rect;

    //rest of drawing code here
}

(显然,我甚至不需要bounds等于rect因为我可以在方法中直接引用rect。)我尝试了两种方式并且他们产生了相同的结果。 self.boundsrect相等吗?如果是,我假设rect用于在幕后某处设置当前视图的边界。但如果它们不是,那么将rect作为一个甚至不使用它的方法的参数有什么用呢?我忽略了一些明显的东西吗?

2 个答案:

答案 0 :(得分:5)

rect告诉您需要绘制哪个区域。它始终小于或等于self.bounds。根据{{​​3}}(强调补充):

  

需要更新视图边界的部分。首先   绘制视图的时间,这个矩形通常是整个   您视图的可见边界。但是,在随后的绘图中   操作,矩形可能仅指定视图的一部分。

如果你绘制视图细分的效率较低,那么你也可以绘制整个视图。

在实践中,仅仅绘制整个事物绝不是瓶颈所以大多数人只是按照最简单的代码更可取的规则来做,除非或直到性能需要不同的方法。

答案 1 :(得分:0)

写入drawRect以传入方法应该绘制的矩形。系统可能只决定视图的一部分(可能是因为大部分视图都被另一个视图覆盖。

如果只需要绘制视图的一部分,则仅绘制该部分会更快。

正如汤米在我输入答案时说的那样,有时候绘制整个视图更容易。