В моем приложении у меня есть 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 без рисования за кадром. Это означает установку объекта, поскольку маска не работает.
Есть ли способ замаскировать изображение на путь без рендеринга за кадром?
Perfect. Изображения следуют по пути безье, и рендеринг происходит на экране. Придется ждать до завтра, чтобы проверить на устройстве, но, согласно профилированию, это сэкономило значительное время. – skladek