2013-05-16 36 views
0

我想繪製一個UIView上的字符數組。問題在於視圖不會自動刷新,因此不顯示字符。當我們在這裏和那裏觸摸屏幕時,它會顯示出來(有時只是char的一部分)。當我們重新繪製一組新的字符(當數組更新時),舊的字符也不會被清除。雖然重畫之前繪製的更新數組並不會從UIView中清除,但它只是在同一視圖上寫入並顯示兩者。當我們reDraw字符串UIView不清除(刷新)

這是我的代碼:

在MyView類中。

-(void)drawRect:(CGRect)rect 
{ 
    context=UIGraphicsGetCurrentContext(); 
} 

-(void)initializeWithChar:(char)characterToDisplay andAttribute:(Byte)attribute 
{ 
    displayChar = characterToDisplay; 
    displayCharAttribute = attribute; 
} 

-(void)setNeedsDisplayInRect:(CGRect)rect{ 

    NSString *charString; 
    UIGraphicsPushContext(context); 
    charString = [NSString stringWithFormat:@"%c",displayChar]; 

    // while background color is black. 
    CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor); 

    [charString drawInRect:CGContextConvertRectToUserSpace(context, rect) 
        withFont:[UIFont fontWithName:@"Courier New" size:10] 
      lineBreakMode:NSLineBreakByWordWrapping 
       alignment:NSTextAlignmentLeft]; 

    UIGraphicsPopContext(); 
} 

-(void)clearScreenInRect:(CGRect) rect{ 
    [self.viewForBaselineLayout setClearsContextBeforeDrawing:YES]; 
    [self.viewForBaselineLayout setOpaque :NO]; 
    CGContextClearRect (context,rect); 

    // I TRIED THIS AS WELL -> but dosen't work.. 
    //CGContextSetFillColorWithColor(contxt, [UIColor blackColor].CGColor); 
    //CGContextFillRect(contxt, rect) ; 

} 

writeDrawView類

// CODE BELOW is DRAWING FRESH ARRAY ON VIEW 

//this method draw a sign in form on view (content are placed in SignInFormArray) 
-(void)writeToDrawViewFrom_SignInFormArray{ 
for (int rownumber = 0; rownumber < 10; rownumber++) { 
    for (int columnNumber = 0; columnNumber < 30; columnNumber++) { 
       [myView initializeWithChar:SignInFormArray[rownumber][columnNumber] andAttribute:Attribute[rownumber][columnNumber]]; 
       [myView setNeedsDisplayInRect:CGRectMake(columnNumber*12 , rownumber*30, 12, 30)]; 
     } 
    } 
} 

-(void)clearButtonClicked{ 
     for (int rownumber = 0; rownumber < 10; rownumber++) { 
      for (int columnNumber = 0; columnNumber < 30; columnNumber++) { 
       [myView clearScreenInRect:CGRectMake(columnNumber*12 , rownumber *30 , 12, 30)]; 
       } 
     } 
} 


// CODE BELOW is UPDATING VIEW FROM UPDATED ARRAY 

//this method draw a home page menu form on view (content are placed in HomePageMenuArray) 
-(void)writeToDrawViewFrom_HomePageMenuArray{ 
for (int rownumber = 0; rownumber < 10; rownumber++) { 
    for (int columnNumber = 0; columnNumber < 30; columnNumber++) { 
       [myView initializeWithChar:HomePageMenuArray[rownumber][columnNumber] andAttribute:Attribute[rownumber][columnNumber]]; 
       [myView setNeedsDisplayInRect:CGRectMake(columnNumber*12 , rownumber*30, 12, 30)]; 
     } 
    } 
} 
+1

爲什麼不在drawRect中繪圖? – Amar

回答

0

的問題是,setNeedsDisplayInRect不保證UIView的立即重繪,如果你檢查的蘋果文檔它說,

這種方法將指定的矩形添加到無效矩形視圖的當前列表 中,並立即返回。

所以你必須在調用這個方法後強制重繪(從我的經驗來看,bringSubviewToFront方法會導致重繪視圖)。所以你應該在撥打setNeedsDisplayInRect後嘗試調用這個方法。

0

@amar:請注意drawRect的文檔:明確地說「你不應該直接調用這個方法」。

我也有同樣的問題: 重畫以前繪製的更新數組不會從UIView中清除,它只是在相同的視圖上寫入並顯示兩者。 當iOS鍵盤上的任何鍵被按下時,我需要在UIView上的特定位置繪製一個字符。