drawRect не вызывается в моем подклассе UIImageView
Я создал подкласс UIImageView и попытался переопределить drawRect, чтобы рисовать поверх изображения с помощью Quartz 2D. Я знаю, что это тупой вопрос новичка, но я не вижу, что я сделал неправильно. Вот интерфейс:
#import <UIKit/UIKit.h>
@interface UIImageViewCustom : UIImageView {
}
- (void)drawRect:(CGRect)rect;
@end
И реализация:
#import "UIImageViewCustom.h"
@implementation UIImageViewCustom
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
}
return self;
}
- (void)drawRect:(CGRect)rect {
// do stuff
}
- (void)dealloc {
[super dealloc];
}
@end
Я установил точку останова на drawRect
и это никогда не бьет, заставляя меня думать, что это никогда не вызывается вообще. Разве он не должен вызываться при первой загрузке представления? Я неправильно переопределил это?
4 ответа
Он будет вызываться только в том случае, если вид видимый и грязный. Может быть, проблема в коде, который создает представление, или в вашем Nib, если вы так его создаете?
Вы также иногда увидите, что точки останова не могут быть установлены правильно, если вы пытаетесь отладить сборку "Release".
Я почему-то пропустил первый раз, когда вы создаете подкласс UIImageView. Из документов:
Особые соображения
Класс UIImageView оптимизирован для отображения его изображений на дисплее. UIImageView не будет вызывать drawRect: в подклассе. Если вашему подклассу требуется пользовательский код для рисования, рекомендуется использовать UIView в качестве базового класса.
Так что у вас есть это. Учитывая то, как легко нарисовать изображение в вашем виде, используя [UIImage drawInRect:] или используя CALayer, вероятно, в любом случае нет веских оснований для создания подкласса UIImageView.
Попробуй добавить
Редактировать:
- (id)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
[self setClearsContextBeforeDrawing:YES];//add this line also
}
return self;
}
- (void)setNeedsDisplay{
[self setNeedsDisplayInRect:self.frame];
}
в ваш код.
надеюсь это поможет.
Спасибо,
madhup
Я думаю, что UIImageView не может использовать для переопределения drawRect
Непосредственно не отвечая на ваш вопрос, но может решить вашу проблему:
Почему это с подклассом UIImageView? Создание подклассов всегда может быть проблематичным, особенно для классов, которые не предназначены для создания подклассов - и я уверен, что UIImageView - нет. Если вы просто хотите нарисовать материал поверх изображения, то создайте вид с прозрачным фоном, нарисуйте все, что вы хотите, и разместите его прямо над изображением.
В зависимости от вашего конкретного случая, может иметь смысл использовать UIButton
с фоновым изображением вместо UIImageView
, Вы могли бы даже установить userInteractionEnabled
к НЕТ, и результат будет неотличим от UIImageView.
В этом случае ваш UIButton
подкласс будет просто включать:
- (void)drawRect:(CGRect)rect
{
if (kSomethingSpecial) {
[self setBackgroundImage:[UIImage imageNamed:@"RedBackground.png"]
forState:UIControlStateNormal];
}
}
Отказ от ответственности - я бы порекомендовал это, только если вы планируете использовать изображение в качестве кнопки, по крайней мере, некоторое время. Я не могу от всего сердца одобрить использование UIButton
в качестве обходного пути для этого поведения drawRect в UIImageView
Я уверен, что у Apple есть свои причины для написания своего API, как упоминал Марк.