2010-03-12 109 views
1

我有一個使用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的需要的應用程序狀態
  • 隱意識繪製的整個過程現在分佈在至少有三種方法

並且就這篇文章來看:我該如何做得更好?那些專家會在整體結構方面提出什麼建議?我如何將應用程序狀態信息保留在視圖之外?我從錯誤的方向看待這個問題嗎?我應該考慮一些完全不同的方法嗎?

回答