2009-07-12 4 views
0

Реализована моя собственная метод drawRect, и я пытаюсь перерисовать фигуру из класса Controller, и я не могу понять, как правильно реализовать setNeedsDisplay, чтобы перерисовать UIView. Пожалуйста помоги!!iPhone Программирование setNeedsDisplay не работает

Я знаю, что код некрасиво, но вот пользовательский метод:

- (void)drawRect:(CGRect)rect{ 
// Drawing code 
NSArray *kyle = [self pointsForPolygonInRect:rect numberOfSides:[pshape numberOfSides]]; 
CGContextRef c = UIGraphicsGetCurrentContext(); 

int counter = [kyle count]; 
NSLog(@"counter: %d",counter); 
int i = 0; 
BOOL first = YES; 

NSValue *kylevalue; 
CGPoint thePoint; 
for (i = 0; i < counter; i++) { 
    kylevalue = [kyle objectAtIndex:i]; 
    thePoint = [kylevalue CGPointValue]; 
    if (first) { //start. 
     CGContextMoveToPoint(c, thePoint.x, thePoint.y+5.0); 
     first = NO; 
    } else { //do the rest 
     CGContextAddLineToPoint(c, thePoint.x, thePoint.y+5.0); 
    } 
} 
CGContextClosePath(c); //solid color 
CGContextDrawPath(c, kCGPathFillStroke);  

}

+0

Извините за путаницу. Я пытаюсь обновить представление из другого класса, и когда я звоню: [pview setNeedsDisplay]; Ничего не происходит. Это не ошибка при запуске, но она не отвечает. – 2009-07-13 00:05:08

ответ

1

Я не уверен, я понимаю ваш вопрос. Вызов -setNeedsDisplay в представлении вызывает его перерисовывание с помощью метода -drawRect :.

+0

Извините за путаницу. Я пытаюсь обновить представление из другого класса, и когда я звоню: [pview setNeedsDisplay]; Ничего не произошло. Это не ошибка при запуске, но она не отвечает. Я помещаю сообщение NSLog для отображения, когда оно входит в drawRect, и оно вводится только один раз, когда приложение запускается. – 2009-07-13 00:06:52

+0

Вы должны проверить, что pview не равен нулю, поскольку сообщения, отправленные в nil, молча игнорируются. – titaniumdecoy

0

всего несколько соображений 1. Вы подтвердили, что ваш метод вызван? 2. Вы подтвердили, что ваш массив точек фактически заполнен более чем одной точкой? 3. являются ли точки фактически видимой областью кадра? 4. Я не вижу, как вы устанавливаете ширину линии, цвет или заливку.

3

У меня были подобные проблемы с перерисовкой, не работающей, как я и ожидал. Кажется, что setNeedsDisplay не заставляет детей перерисовывать, для тех, кому нужно вызвать их метод setNeedsDisplay.

Для моих нужд я написал категорию, чтобы перерисовать весь экран, вызвав setNeedsDisplay на каждом отдельном представлении. Конечно, это можно легко изменить, чтобы начать с определенного вида, а не со всех окон.

@implementation UIApplication (Extensions) 

+ (void) redrawScreen { 
NSMutableSet* todo = [NSMutableSet set]; 
NSMutableSet* done = [NSMutableSet set]; 
[todo addObjectsFromArray:[[UIApplication sharedApplication] windows]]; 

while ([todo count] > 0) { 
    UIView* view = [todo anyObject]; 
    [view setNeedsDisplay]; 

    [done addObject:view]; 
    [todo removeObject:view]; 

    if (view.subviews) { 
    NSMutableSet* subviews = [NSMutableSet setWithArray:view.subviews]; 

    [subviews minusSet:done]; 
    [todo unionSet:subviews]; 
    } 
} 
} 

@end 

Надежда это помочь кому-то

0

Иногда причина может быть очень просто: владелец файла не имеет никакого отношения к объекту UIView. то есть его выход не настроен должным образом. Используйте кнопку IB, ctrl и метод перетаскивания:

0

Если ваш сюжет имеет метод drawRect, посмотрите на свой viewController в коде, где он соединяется с вашим сюжетом. Правильно ли это подключено? Является ли маленьким кругом свойство полого? или заполнен. Этот маленький круг должен быть заполнен, если свойство подключено должным образом. Если это пусто, поднимите рассказ.

Найти объект участка в доске объявлений. Управляйте перетаскиванием объекта сюжета в доску истории до пустого круга на контроллере. Теперь вы подключили розетку. Попробуйте запустить его снова и посмотрите, вызывается ли теперь ваш drawRect.

Смежные вопросы