Я понимаю, что это старые новости, но просто немного свести их к минимуму:
Здесь есть два возможных вопроса: (1) как применить закругленные углы к UIView (например, UIImageView), который будет отображаться на экране, и (2) как замаскировать квадратное изображение (то есть UIImage) для создания нового изображения с закругленными углами.
Для (1) проще всего использовать CoreAnimation и установить свойство view.layer.cornerRadius
// Because we're using CoreAnimation, we must include QuartzCore.h
// and link QuartzCore.framework in a build phases
#import <QuartzCore/QuartzCore.h>
// start with an image
UIImage * fooImage = [UIImage imageNamed:@"foo.png"];
// put it in a UIImageView
UIView * view = [UIImageView alloc] initWithImage:fooImage];
// round its corners. This mask now applies to the view's layer's *background*
view.layer.cornerRadius = 10.f
// enable masksToBounds, so the mask applies to its foreground, the image
view.layer.masksToBounds = YES;
Для (2) лучше всего использовать графические операции UIKit:
// start with an image
UIImage * fooImage = [UIImage imageNamed:@"foo.png"];
CGRect imageRect = CGRectMake(0, 0, fooImage.size.width, fooImage.size.height);
// set the implicit graphics context ("canvas") to a bitmap context for images
UIGraphicsBeginImageContextWithOptions(imageRect.size,NO,0.0);
// create a bezier path defining rounded corners
UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:imageRect cornerRadius:10.f];
// use this path for clipping in the implicit context
[path addClip];
// draw the image into the implicit context
[fooImage drawInRect:imageRect];
// save the clipped image from the implicit context into an image
UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext();
// cleanup
UIGraphicsEndImageContext();
Сложность проблемы (2) в том, что вы можете подумать, что можете выполнить всю операцию, используя свойство view.layer.mask в CoreAnimation. Но вы не можете, потому что метод CALayer renderInContext:
, который вы использовали бы для генерации UIImage из маскированного слоя, похоже, игнорирует маску. Хуже того, документация для renderInContext:
не упоминает об этом, а только ссылается на поведение для OSX 10.5.
Некоторый дополнительный контекст: вышеупомянутый подход к (2) использует обертки UIKit вокруг более базовой функциональности CoreGraphics. Вы можете сделать то же самое, используя вызовы CoreGraphics напрямую - это то, что делает выбранный ответ, - но тогда вам нужно вручную построить округленный прямоугольный путь Безье из кривых и линий, а также необходимо компенсировать тот факт, что CoreGraphics использует система координат рисования, которая перевернута относительно UIKit.