gpt4 book ai didi

iOS:为什么 drawRect: 被调用了两次,为什么这个 ivar 值似乎无缘无故地改变了?

转载 作者:行者123 更新时间:2023-11-28 23:15:16 24 4
gpt4 key购买 nike

为了实现自定义的 drawRect 方法,我创建了一个 UIView 子类。通过在代码中放置一些日志,我发现 drawRect 实际上被调用了两次,因为 View 首先由其 View Controller 设置。这是为什么?

另一个问题是我的 UIView 子类有一个名为 needsToDrawTools 的 ivar。我为该子类指定的初始化程序将 needsToDrawTools 的值设置为 YES。然后 drawRect 方法检查这个值。如果是,它会绘制工具,然后将 needsToDrawTools 的值设置为 NO,这样它就不会重新绘制工具。

但是,在调用 drawRect 时,不知何故 needsToDrawTools 的值为 NO。除了在 drawRect 内的 if(needsToDrawTools) 语句中,我没有在代码中将其设置为 NO。但由于 needsToDrawTools 在到达 if 语句时已经为 NO,因此语句中的代码甚至从未运行过。如果我完全删除该 IF 语句,那么它当然会运行并且我会在 View 中看到我所期望的。但我不想删除 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;
}
}

那么,我的两个问题是:

  1. 为什么 drawRect 被调用了两次?我假设它在 View 加载过程中第一次被自动调用,但我不知道为什么它会再次被调用。

  2. needsToDrawTools 如何以 NO 结束?

最佳答案

听起来您拥有此 View 的多个实例。也许您正在以编程方式创建一个并从 Nib 加载一个? Objective-C 将在创建对象时将所有 ivar 设置为零(或 nil,或 NO),并且如果您从 nib 加载 View 实例,则不会使用您的 -( id)initWithParentViewController:needsToDrawTools 对于该 View 应该为 NO。

关于iOS:为什么 drawRect: 被调用了两次,为什么这个 ivar 值似乎无缘无故地改变了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6733590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com