DrawRect пользовательского UIView никогда не вызывается, если начальный кадр CGRectZero - PullRequest
10 голосов
/ 27 мая 2011

У меня есть довольно простой пользовательский подкласс UIView:

#import "BarView.h"
#import <QuartzCore/QuartzCore.h>

@implementation BarView

@synthesize barColor;

- (void)drawRect:(CGRect)rect
{
    NSLog(@"drawRect");
    // Draw a rectangle.
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, self.barColor.CGColor);
    CGContextBeginPath(context);
    CGContextAddRect(context, self.bounds);
    CGContextFillPath(context);
}

- (void)dealloc
{
    self.barColor = nil;

    [super dealloc];
}

@end

Если я вызову initWithFrame: rect для этого класса с некоторым ненулевым прямоугольником, он работает нормально;но когда я вызываю initWithFrame: CGRectZero, drawRect не вызывается, даже после того, как я изменяю фрейм представления на ненулевой прямоугольник.

Я, конечно, понимаю, почему у представления с нулевым фреймом никогда не будет drawRect: call, но почему он никогда не вызывается даже после смены кадра?

1 Ответ

27 голосов
/ 27 мая 2011

Беглый взгляд на документы Apple говорит, что это

Изменение прямоугольника рамки автоматически отображает представление без вызова его метода drawRect :.Если вы хотите, чтобы UIKit вызывал метод drawRect: при изменении прямоугольника фрейма, установите для свойства contentMode значение UIViewContentModeRedraw.

Это указано в документации по свойству фрейма:
https://developer.apple.com/documentation/uikit/uiview/1622621-frame?language=objc

Если вы хотите перерисовать представление, просто вызовите для него setNeedsDisplay, и все будет в порядке (или, как говорят документы, вы можете установить для него значение UIViewContentModeRedraw, но это зависит от вас)

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