2013-06-04 36 views
2

我目前正在建立自定義UIActivityIndicator。爲了做到這一點,我創建了以下平局RECT功能:如何正確使用DrawRect

-(void) drawRect:(CGRect)rect 
{ 
CGPoint point; 
NSLog(@"here %d",stage);` 

CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGContextSetLineWidth(ctx, 2.0); 

for (int i = 1 ; i<=10; ++i) { 


    CGContextSetStrokeColorWithColor(ctx, [[self getColorForStage:stage+i WithAlpha:0.1 *i] CGColor]); 
    point = [self pointOnOuterCirecleWithAngel:stage+i]; 
    CGContextMoveToPoint(ctx, point.x, point.y); 
    point = [self pointOnInnerCirecleWithAngel:stage+i]; 
    CGContextAddLineToPoint(ctx, point.x, point.y); 
    CGContextStrokePath(ctx); 
} 



stage++; 
} 

而且我添加了一個NSTimer調用[self setNeedsDisplay];

動畫工作正常,但是當我每次都導入到我的應用程序將滾動表或做任何動畫將停止,直到錶停止移動。

我認爲只有在UI完成後更新它更新我的drawRect,但我怎麼能解決它或做正確的方式

+0

* *角度轉動是的措施,而*天使*是天體的行爲者(帶翅膀和光環)。另外,* circle *沒有中間的'e'。 – dreamlax

回答

3

如果希望在表視圖(或任何其他滾動視圖)滾動時觸發,則必須使用不同的runloop模式手動安排計時器。默認情況下,定時器在滾動時不會觸發以提高性能。

NSTimer *timer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(setNeedsDisplay) userInfo:nil repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

(你會得到與NSDefaultRunLoopMode代替NSRunLoopCommonModes默認行爲。)

+0

完美的作品!你認爲在抽籤方法上放置計時器是最佳做法嗎?或theres正確的方式來實現這樣的事情? –

0

,如果你描述你想要的結果會是什麼樣這將幫助。從查看代碼看起來,您嘗試實現多色環。你指的是動畫,但這裏沒有真正的動畫。它可能看起來像動畫,基於間隔重繪,但我不確定即將發生的事情。如果每次都重繪完全相同的東西,您將看不到任何看起來像動作的東西。每次處理drawRect時,您調用的方法(getColorForStagepointOnOuterCirecleWithAngel)是否爲相同的參數返回不同的結果?

您不應該使用drawRect來實現動畫。 drawRect應該使你的視圖看起來像它應該看起來,然後什麼都不做,直到它再次需要。通常它不需要再次調用,除非視圖被隱藏並且操作系統回收了保存其像素的內存。 setNeedsDisplay的目的是觸發drawRect被再次調用,因爲視圖代表的信息已經改變,而不是更新正在進行的相同數據的動畫。您可以通過很多方式更改視圖的外觀,而不需要再次運行drawRect,例如更改其大小,位置,alpha或旋轉它。

如果在平移和縮放期間drawRect沒有被調用,並且setNeedsDisplay的調用排隊等待調整視圖後,我不會感到驚訝。

您應該使用Core Animation。希望Core Animation在平移和縮放過程中保持運行。您應該能夠通過一次調用drawRect繪製圖標,然後使用Core Animation來旋轉它或某物來獲得所需的效果。

1

你不應該叫[self setNeedsDisplay]; 做到在視圖didload