2012-08-09 29 views
1

對於自定義UIView子類,我在drawRect中有一個複雜的Quartz例程。可能需要幾秒鐘才能繪製。我想要的是在繪圖時顯示UIActivityIndicator。但是在繪圖完成後,指標必須停止旋轉(並隱藏)。在Quartz中繪圖時顯示UIActivityIndi​​cator

我試圖啓動指標的動畫,然後使用performSelector作爲簡單調用setNeedsDisplay的自定義方法 - 我的想法是performSelector將等到下一個運行循環,對吧?在這種情況下,我的指標有時間在主線程上啓動。這似乎正在工作,但只要我將代碼添加到drawRect的末尾以停止動畫,指示器根本不會顯示,就好像該動畫在它有機會開始之前就結束一樣。

有什麼建議嗎?

我稱這樣的圖:

[self.spinner startAnimating]; 
[self performSelectorOnMainThread:@selector(redraw) withObject:nil waitUntilDone:YES];//tried both YES and NO here 

-(void)redraw{ 
[self.customView setNeedsDisplay]; 

}

drawRect:簡單地具有本底:

- (void)drawRect:(CGRect)rect{ 
    //bunch of drawing 
    [self.nav stopSpinner]; // reference to a controller class 
    } 

self.nav對象是這樣的:

-(void)stopSpinner{ 
self.spinner.hidden=YES; 
[self.spinner stopAnimating]; 
} 

spinner對象最初創建這樣的:

self.spinner=[[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]autorelease]; 
    self.spinner.hidden=YES; 
    [self.viewController.view addSubview:self.spinner]; 
+1

向我們展示了'的drawRect:'代碼,試圖阻止紡紗。 – 2012-08-09 06:42:57

+0

這很長,我寧願不要在這裏發佈;然而函數的'}'前面最後一行是'UIActivityIndi​​cator'的消息,因爲它會停止動畫。 – johnbakers 2012-08-09 07:18:00

+0

編輯你的問題並粘貼在該行。 – 2012-08-09 07:31:46

回答

0

在後臺線程上執行繪圖。這不僅可以讓你拋出一個活動指示器並根據需要製作動畫,而且繪製本身的速度要快得多。在我的測試中,我已經看到在後臺線程中複雜的Quartz繪圖中速度提高了10倍。

這並不難。事實上,它可能非常快,你不需要活動指標。

下面的代碼,你可以簡單地使用常規UIImageView然後將其image屬性分配給從其他線程渲染輸出:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 

    dispatch_async(queue, ^{ 

    UIGraphicsBeginImageContext(self.bounds.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    //perform some drawing into this context 

    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 


    dispatch_sync(dispatch_get_main_queue(), ^{ 
     self.imageView.image=viewImage; 
    }); 
}); 
相關問題