У меня были похожие проблемы с перерисовкой, которая не работала, как я и ожидал. Кажется, что 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
Надеюсь, это кому-то поможет