drawRect, не будучи названным в моем подклассе UIImageView

Я разделил UIImageView на подклассы и попытался переопределить drawRect, таким образом, я мог потянуть сверху изображения с помощью 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 и это никогда не совершает нападки, ведя меня, чтобы думать, что в это никогда не заходят все. Разве это не предположено быть названным, когда представление сначала загружается? Разве я неправильно переопределил его?

42
задан Peter Hosey 10 April 2010 в 18:16
поделиться

3 ответа

Он будет вызываться только в том случае, если представление является видимым и грязным. Может быть, проблема в коде, который создает представление, или в вашем Nib, если вы его создаете именно так?

Иногда вы также можете увидеть, что точки останова не устанавливаются должным образом, если вы пытаетесь отладить " Выпуск "сборка.


Я как-то пропустил первый раз, когда вы создаете подкласс UIImageView. Из документации:

Особые соображения

Класс UIImageView оптимизирован для вывода своих изображений на дисплей. UIImageView не будет вызывать drawRect: в подклассе . Если вашему подклассу требуется код пользовательского рисования, рекомендуется использовать UIView в качестве базового класса.

Итак, вот оно. Учитывая, насколько легко нарисовать изображение в вашем представлении с помощью [UIImage drawInRect:] или с помощью CALayer, вероятно, в любом случае нет веских причин для создания подкласса UIImageView.

87
ответ дан 26 November 2019 в 23:39
поделиться

Попробуйте добавить

Edit:

- (id)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        [self setClearsContextBeforeDrawing:YES];//add this line also
    }
    return self;
}


- (void)setNeedsDisplay{
    [self setNeedsDisplayInRect:self.frame];
}

в ваш код.

Надеюсь, это поможет.

Thanks,

madhup

1
ответ дан 26 November 2019 в 23:39
поделиться

Не отвечает напрямую на ваш вопрос, но может решить вашу проблему:

Почему это нужно делать с подклассом UIImageView? Создание подклассов всегда может быть проблематичным, особенно для классов, которые не предназначены для создания подклассов - и я уверен, что UIImageView - нет. Если вы просто хотите нарисовать что-то поверх изображения, создайте представление с прозрачным фоном, нарисуйте все, что хотите, и поместите его прямо поверх изображения.

0
ответ дан 26 November 2019 в 23:39
поделиться