【发布时间】:2011-07-18 13:24:54
【问题描述】:
我创建了一个 UIView 子类来实现自定义 drawRect 方法。通过在代码中放置一些日志,我发现 drawRect 实际上被调用了两次,因为视图首先由其视图控制器设置。这是为什么呢?
另一个问题是我的 UIView 子类有一个名为 needsToDrawTools 的 ivar。我为这个子类指定的初始化程序将 needsToDrawTools 的值设置为 YES。然后 drawRect 方法检查这个值。如果是,它会绘制工具,然后将 needsToDrawTools 的值设置为 NO,这样它就不会重新绘制工具。
但是,在调用 drawRect 时,needToDrawTools 的值不知何故为 NO。除了在drawRect中的if(needsToDrawTools)语句中,我在我的代码中没有将它设置为NO。但是由于 needToDrawTools 在到达 if 语句时已经是 NO,因此语句中的代码甚至永远不会运行。如果我完全删除该 IF 语句,那么它当然会运行,并且我会在视图中看到我所期望的。但我不想删除 IF 语句,因为这会导致重新绘制不需要重新绘制的东西。
这是我的代码:
- (id)initWithParentViewController:(NewPhotoEditingViewController *)vc
{
self = [super init];
if (self) {
parentVC = vc;
needsToDrawTools = YES;
NSLog(@"needsToDrawTools: %i",needsToDrawTools); //Console result: 1
}
return self;
}
#pragma mark - Drawing
- (void)drawRect:(CGRect)rect
{
NSLog(@"needsToDrawTools: %i",needsToDrawTools); //Console result: 0 !!!!!
if (needsToDrawTools){
NSLog(@"drawingTools"); //Never shows up in the console
UIBezierPath *toolPointDragger = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(75, 100, 30, 30)];
[[UIColor blackColor] setStroke];
toolPointDragger.lineWidth = 6;
[toolPointDragger stroke];
[[UIColor blueColor] setFill];
[toolPointDragger fill];
needsToDrawTools = NO;
}
}
所以,我的两个问题是:
为什么 drawRect 被调用两次?我假设它在视图加载过程中第一次被自动调用,但我不知道为什么它会再次被调用。
needToDrawTools 如何以 NO 结束?
【问题讨论】:
-
您可以尝试将 NSLog(@"Self is %p",self) 添加到这两种方法中。您可能有几个不同的实例在这里工作。新实例的 needsToDrawTools 的默认值当然是 NO。
标签: ios cocoa-touch drawing drawrect