我正在尝试在UIView上绘制一个字符数组。问题是视图不会自动刷新,因此不会显示字符。当我们在这里和那里触摸屏幕时,它就会显示出来(有时只显示字符的一部分)。当我们重新绘制新的字符集时(当数组更新时),旧的字符集也不会被清除。虽然重绘之前绘制的更新数组不会从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)];
}
}
}发布于 2013-05-16 20:42:17
问题是,setNeedsDisplayInRect不能保证立即重新绘制UIView,如果你查看苹果文档,上面写着
此方法将指定的矩形添加到视图的当前无效矩形列表中,并立即返回。
因此,您必须在调用此方法后强制执行重绘(根据我的经验,bringSubviewToFront方法可能会导致视图重绘)。因此,您应该在调用setNeedsDisplayInRect之后尝试调用此方法。
发布于 2013-05-16 22:42:49
@amar:请注意,drawRect的文档中明确表示“您永远不应该自己直接调用此方法。”
我也有同样的问题:虽然重绘之前绘制的更新数组不会从UIView中清除,但它只是在相同的视图上写入并同时显示两者。当iOS键盘上的任何键被按下时,我需要在UIView上的那个特定位置绘制一个字符。
https://stackoverflow.com/questions/16586378
复制相似问题