我已經創建了一個UIView子類來實現一個自定義drawRect方法。通過在代碼中放置一些日誌,我發現drawRect實際上是在視圖首先由視圖控制器設置時調用兩次。爲什麼是這樣?iOS:爲什麼drawRect:被調用兩次,爲什麼這個ivar值看起來沒有任何理由變化?
另一個問題是我的UIView子類有一個名爲needsToDrawTools的ivar。我爲這個子類指定的初始化器將needsToDrawTools的值設置爲YES。 drawRect方法然後檢查這個值。如果是,則繪製工具,然後將needsToDrawTools的值設置爲NO,以便它不再重新繪製工具。
但是,不知何故,drawRect被調用時,needsToDrawTools的值是NO。在我的代碼中沒有任何地方將它設置爲NO,除了在drawRect中的if(needsToDrawTools)語句中。但是由於needsToDrawTools在達到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中被調用兩次?我認爲它會自動作爲視圖加載過程的一部分自動調用,但我不知道爲什麼它會再次被調用。
needsToDrawTools如何以NO值結束?
你可能會嘗試在兩種方法中添加NSLog(@「Self is%p」,self)。這可能是你在這裏工作的幾個不同的例子。 needsToDrawTools對於新實例的默認值當然是NO。 –