DrawRect UIView не вызывается, когда пьяный
Я экспериментирую с продвинутыми методами Objective-C. Чего я хочу добиться, так это добавить определенный код чертежа к существующему UIView
,
Я начал легко, я продолжил объявлять свой drawRect
метод в категории:
@interface UIView (Swizzled)
- (void)my_drawRect:(CGRect)rect;
@end
Тогда я выпил drawRect
метод UIView
в реализации категории:
+ (void)load
{
[self swizzleInstanceMethod:@selector(drawRect:) withMethod:@selector(my_drawRect:) inClass:[UIView class]];
}
- (void)my_drawRect:(CGRect)rect
{
NSLog (@"Test.");
}
Реализация этого метода доступна на GitHub, а Swizzling работает во всех других случаях.
Так что по логике каждый раз drawRect
называется, надо просто распечатать "Тест". Но это не работает, метод, который я пробовал, никогда не вызывается. Я узнал, что я сделал не так, но чем больше я на это смотрю, тем больше я верю, что проблема в другом.
Что делать, если drawRect
метод даже не вызывается? Я попытался заставить его называться:
view.contentMode = UIViewContentModeRedraw;
[view setNeedsDisplay];
Тоже не работает
Итак, мой вопрос:
Как заставить UIView
звонить drawRect
в этом случае или даже моя извращенная реализация?
Спасибо!
1 ответ
Во-первых, читайте в drawRect или не в drawRect (когда следует использовать drawRect/Core Graphics против подпредставлений / изображений и почему?)
В принципе, UIView
проверяет переопределение drawRect:
или нет. Если вы не переопределите его, он может выполнить много оптимизаций при рисовании, и метод даже не будет вызван.
В этом случае вы не изменили это так UIView
не видит причин для его вызова, даже если вы заменили пустую реализацию чем-то другим.