UIImage не обрезается путем отсечения

У меня есть подкласс UIView, который содержит UIImageView. Я хочу, чтобы изображение выглядело круглым, поэтому я сделал следующее:

- (void)drawRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSaveGState(ctx);
    CGPathRef clippath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:17].CGPath;
    CGContextAddPath(ctx, clippath);
    CGContextClip(ctx);
    [self.imageView.image drawInRect:rect];
    CGContextRestoreGState(ctx);
}

Однако изображения не круглые, а правильные прямоугольники. В чем проблема?


person damjandd    schedule 31.01.2014    source источник
comment
ваш UIImageView является подвидом вашего UIView? Если это так, он будет показан поверх рисования функции drawRect, и поэтому вы видите UIImageView, а не свой UIView с настраиваемым рисунком.   -  person Putz1103    schedule 31.01.2014
comment
Мой UIImageView на самом деле является подклассом AsyncImageView от UIImageView. У моего UIView есть xib, и в этом xib добавлен AsyncImageView и подключен к выходу с именем imageView. Отвечает ли это на ваш вопрос?   -  person damjandd    schedule 31.01.2014
comment
да. Если ваш imageView находится поверх вашего UIView (как подпредставление), вы никогда не увидите рисунок. У вас есть пара вариантов, я отправлю ответ.   -  person Putz1103    schedule 31.01.2014


Ответы (1)


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

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

Во втором вам вообще не нужен UIImageView, только UIImage. UIImageView - это просто способ отобразить UIImage на экране, и если об этом позаботятся в пользовательском чертеже вашего представления, то UIImageView вам не понадобится.

Учитывая эти параметры, я считаю, что UIImageView с cornerRadius будет наиболее эффективным. Пользовательский рисунок требует немного процессорного времени, о котором UIImageView позаботится за вас.

person Putz1103    schedule 31.01.2014
comment
Прежде всего, я смотрел на SO весь день, и все, казалось, предполагали, что пути обрезки были намного быстрее, чем закругленные углы. Этого я пытался избежать. Во-вторых, мне нужно использовать UIImageView, потому что, как я уже сказал, на самом деле это не UIImageView, а AsyncImageView, поэтому мне нужна его функциональность. А с clipsToBounds как-то не получилось? - person damjandd; 31.01.2014
comment
Вы можете неправильно понять, что он предлагает. Если у вас есть что-то вроде [self addSubview:self.imageView] где-то в вашем коде или если это представление является подвидом в вашем xib, то необрезанное изображение будет рисоваться поверх вырезанного изображения, которое вы создаете в drawRect. - person Manny; 31.01.2014