drawRect не вызывается для UIImageView - PullRequest
4 голосов
/ 23 февраля 2012

У меня в IB есть UIImageView, и я создал подкласс UIImageView с помощью одного метода drawRect:

@implementation UIImageViewLine

- (void)drawRect:(CGRect)rect
{
    NSLog(@"CALLED");
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
    CGContextSetLineWidth(context, 1.0f);
    CGContextMoveToPoint(context, 0, 0); 
    CGContextAddLineToPoint(context, self.frame.size.width, self.frame.size.height);
    CGContextStrokePath(context);

}

@end

Я изменил класс UIImageView на этот подкласс, однако drawRect никогда не вызывается.Есть идеи почему?

Ответы [ 2 ]

23 голосов
/ 23 февраля 2012

UIImageView не вызывает drawRect в подклассах.

Из документации :

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

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

0 голосов
/ 11 февраля 2015

В дополнение к ответу sch стоит отметить, как UIImageView можно использовать иначе, чем UIView.

Подход с ImageView заключается в том, что вы изменяете его свойство .image. Это означает, что изображение кэшируется в стеке представления. Если изображение меняет каждый кадр, то это мало что дает. Но если это не так, это значительное улучшение. В большинстве игр / приложений большинство объектов не меняют каждый кадр.

Вы можете изменить местоположение, ротацию и непрозрачность UIView с помощью вызовов базового CALayer. Это всего лишь изменение в матрице преобразования, поэтому оно не требует / не теряет времени.

Я настоятельно рекомендую всем, кто делает 2D-графику в реальном времени, кто не знаком с этим аргументом, читает https://developer.apple.com/library/ios/qa/qa1708/_index.html, который объясняет аргумент намного лучше и дает пример кода. Это удивительно просто сделать.

Идея оборачивания игрового объекта в UIImageView кажется нелогичной, поскольку вы не хотите отделять игровую логику от уровня представления, и это связывает их вместе. Однако, только модифицировав мой прототип игры в соответствии с рекомендацией Apple, я получаю удвоенную частоту кадров, поэтому я очень хочу поставить под угрозу свою архитектурную чистоту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...