2014-10-27 2 views
0

В моем приложении у меня есть UIImageView в UITableViewCell. Изображения должны отображаться как круговые изображения с прямоугольными исходными изображениями. Я устанавливал радиус угла в свойстве слоя imageView, но это заставляет внеэкранный рендер, который замедляет производительность при прокрутке.Нарисуйте UIImage как круг без визуализации экрана

Вот что я в настоящее время в методе awakeFromNib на клетки:

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 

    self.imageBorderView.backgroundColor = [UIColor colorWithWhite:0.75f alpha:1.f]; 
    self.imageBorderView.layer.cornerRadius = self.imageBorderView.frame.size.width/2; 
} 

Действительно основной материал. Хорошо, так что я просто смотрел видеоролик сессии WSDC 2011 года, Understanding UIKit Rendering. Это коснулось этой проблемы, поскольку она относится к UILabel, перемещая рендеринг радиуса угла в drawRect с помощью UIBezierPaths. Я подклассифицировал UIImageView и переместил рисунок cornerRadius на drawRect, чтобы найти, что drawRect не вызывается в UIImageView. Вот соответствующие аргументы из документов:

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

Поэтому я заменил суперкласс на UIView, и я вручную рисую круг, используя UIBezierPath и UIImage в drawRect. Вот мой метод DrawRect:

- (void)drawRect:(CGRect)rect 
{ 
    UIBezierPath *circularPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:self.bounds.size.height/2.0]; 
    [[UIColor redColor] set]; 
    [circularPath fill]; 

    if (self.image) 
    { 
     [self.image drawInRect:self.bounds]; 
    } 
} 

Это именно то, что я хотел бы ожидать, он рисует красный круг (только проверку разумности, чтобы убедиться, что правильный путь), то он рисует прямоугольное изображение по кругу, если один был установлен.

Я не могу понять, как обрезать UIImage на круговой UIBezierPath без рисования за кадром. Это означает установку объекта, поскольку маска не работает.

Есть ли способ замаскировать изображение на путь без рендеринга за кадром?

ответ

2

Позвоните -[UIBezierPath addClip], чтобы закрепить следующий чертеж на внутренней стороне пути.

- (void)drawRect:(CGRect)rect 
{ 
    UIBezierPath *circularPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:self.bounds.size.height/2.0]; 
    [circularPath addClip]; 
    [self.image drawInRect:self.bounds]; 
} 
+0

Perfect. Изображения следуют по пути безье, и рендеринг происходит на экране. Придется ждать до завтра, чтобы проверить на устройстве, но, согласно профилированию, это сэкономило значительное время. – skladek

0

Вы усложнять вещи, несколько лет назад у меня была такая же проблема и как я решил его использовал программно созданный UITableViewCell, который имел UIView, в котором я использовал QuartzCore и установить cornerRadius, потом я добавил UIImageView внутри него (UIView), и он всегда делал его очень быстрым, не вдаваясь в подробности UIBeziers.

+0

Это был мой первоначальный подход, но он недостаточно рендеринга. Это не страшно, но это не маслянистое, как должно быть. – skladek

+0

Если это ваш ответ, мне нужно спросить/предложить вам две вещи: во-первых, насколько велики ваши изображения (по размеру и размерам), вы отлаживали свое приложение с помощью ** инструментов Xcode® ** и рассматривали использование памяти и процессора, это может случиться, что большую часть времени память раздувается с изображениями из и из-за многократных ячеек или обработки процессора ** больших ** изображений. – MrJomp