我有一個使用drawRect的根本問題:任何意見將不勝感激。幫助需要與drawRect:
應用程序需要與動畫繪製各種在不同時間的圖像png格式的,有時,有時沒有。
,我希望能堅持一個設計目標是讓裏面的drawRect代碼:很簡單,「啞巴」 - 即只是圖紙,沒有其他應用程序邏輯。
要繪製圖像我正在使用UIImage的drawAtPoint:方法。由於此方法不會將CGContext作爲參數,因此只能在drawRect:方法內調用它。所以我有:
- (void)drawRect:(CGRect)rect {
[firstImage drawAtPoint:CGPointMake(firstOffsetX, firstOffsetY)];
}
一個圖像的所有罰款和花花公子。爲了繪製多個圖像(隨着時間的推移),我採取的方法是維護一個字典數組,每個字典包含一個圖像,要繪製的點位置以及一個標誌以啓用/禁止該圖像的繪製。隨着時間的推移,我將字典添加到數組中,並通過UIView的setNeedsDisplay:方法觸發繪圖。使用字典數組可以隨時完全重建整個顯示。 drawRect:現在變爲:
- (void)drawRect:(CGRect)rect {
for (NSMutableDictionary *imageDict in [self imageDisplayList]) {
if ([[imageDict objectForKey:@"needsDisplay"] boolValue]) {
[[imageDict objectForKey:@"image"] drawAtPoint:[[imageDict objectForKey:@"location"] CGPointValue]];
[imageDict setValue:[NSNumber numberWithBool:NO] forKey:@"needsDisplay"];
}
}
}
還行。代碼簡單而緊湊。動畫這是我遇到問題的地方。第一個問題是我在哪裏放置動畫代碼?我把它放在UIView或UIViewController中嗎?如果在UIView中,我把它放在drawRect中還是其他地方?由於實際的動畫取決於應用程序的整體狀態,我需要嵌套switch語句,如果投入的drawRect:,會是這個樣子:
- (void)drawRect:(CGRect)rect {
for (NSMutableDictionary *imageDict in [self imageDisplayList]) {
if ([[imageDict objectForKey:@"needsDisplay"] boolValue]) {
switch ([self currentState]) {
case STATE_1:
switch ([[imageDict objectForKey:@"animationID"] intValue]) {
case ANIMATE_FADE_IN:
[self setAlpha:0.0];
[UIView beginAnimations:[[imageDict objectForKey:@"animationID"] intValue] context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:2];
[self setAlpha:1.0];
break;
case ANIMATE_FADE_OUT:
[self setAlpha:1.0];
[UIView beginAnimations:[[imageDict objectForKey:@"animationID"] intValue] context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView setAnimationDuration:2];
[self setAlpha:0.0];
break;
case ANIMATE_OTHER:
// similar code here
break;
default:
break;
}
break;
case STATE_2:
// similar code here
break;
default:
break;
}
[[imageDict objectForKey:@"image"] drawAtPoint:[[imageDict objectForKey:@"location"] CGPointValue]];
[imageDict setValue:[NSNumber numberWithBool:NO] forKey:@"needsDisplay"];
}
}
[UIView commitAnimations];
}
另外,進行多次連續的動畫正常工作,則需要有一個涉及動畫委託的外部控制機制animationDidStop:將設置字典中的needsDisplay條目以允許/禁止繪製(和動畫)的回調。
我們現在的觀點是,它開始看起來非常醜陋。更具體地講:
- 的drawRect:開始迅速膨脹和包含的代碼是不是「只是畫」代碼
- UIView的需要的應用程序狀態
- 隱意識繪製的整個過程現在分佈在至少有三種方法
並且就這篇文章來看:我該如何做得更好?那些專家會在整體結構方面提出什麼建議?我如何將應用程序狀態信息保留在視圖之外?我從錯誤的方向看待這個問題嗎?我應該考慮一些完全不同的方法嗎?