UIView не очищает (Обновить), когда мы перерисовываем строку
Я пытаюсь нарисовать массив символов в 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)];
}
}
}
2 ответа
Проблема в том, что setNeedsDisplayInRect
не гарантирует немедленную перерисовку UIView, если вы проверите Apple, документ, который говорит, что
Этот метод добавляет указанный прямоугольник в текущий список недопустимых прямоугольников и возвращает его немедленно.
Таким образом, вы должны вызвать перерисовку после вызова этого метода (из моего опыта bringSubviewToFront
метод может вызвать перерисовку представлений). Поэтому вы должны попробовать вызвать этот метод после вызова setNeedsDisplayInRect
,
@amar: Обратите внимание, что в документации для drawRect: явно сказано: "Никогда не вызывайте этот метод непосредственно самостоятельно".
У меня также есть та же проблема: хотя перерисовка обновленного ранее нарисованного массива не удаляется из UIView, он просто перезаписывает один и тот же вид и отображает оба. И когда нажимается любая клавиша на клавиатуре iOS, мне нужно нарисовать символ в этом конкретном месте в UIView.