Создание UIImage в форме круга

Я пытался замаскировать UIImage в круг. Я использую теперь код, который был популярен в других ответах здесь, но, хотя я получаю круг, его края очень зубчатые и не гладкие. Кто-нибудь может помочь? Я получаю идеальный, гладкий круг?

Код, который я использую для создания маски:

(UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage { CGImageRef imageNoAlpha = image.CGImage; CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB(); CGFloat width = CGImageGetWidth(imageNoAlpha); CGFloat height = CGImageGetWidth(imageNoAlpha); CGContextRef ctxWithAlpha = CGBitmapContextCreate(nil, width, height, 8, 4*width, cs, kCGImageAlphaPremultipliedFirst); CGContextDrawImage(ctxWithAlpha, CGRectMake(0, 0, width, height), imageNoAlpha); CGImageRef imageWithAlpha = CGBitmapContextCreateImage(ctxWithAlpha); CGImageRef maskRef = maskImage.CGImage; CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), NULL, false); CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask); UIImage* retImage= [UIImage imageWithCGImage:masked]; UIImage* retImageFixed = [retImage transparentBorderImage:1]; CGImageRelease(mask); CGImageRelease(masked); CGImageRelease(imageWithAlpha); CGContextRelease(ctxWithAlpha); CGColorSpaceRelease(cs); return retImageFixed; 

Заранее спасибо…

попробуйте этот код

 yourImageView.layer.cornerRadius = yourImageView.frame.size.height /2; yourImageView.layer.masksToBounds = YES; yourImageView.layer.borderWidth = 0; 

это изображение, похожее на изображение ios 7 circle thanks

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

например. В моем случае я хочу отобразить изображение на «imageView» , поэтому радиус угла в этом случае будет равен imageView.frame.size.width / 2

 - (void)displayImage { imageView.image = [self getRoundedRectImageFromImage:@"Test.png" onReferenceView:imageView withCornerRadius: imageView.frame.size.width/2]; } - (UIImage *)getRoundedRectImageFromImage :(UIImage *)image onReferenceView :(UIImageView*)imageView withCornerRadius :(float)cornerRadius { UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 1.0); [[UIBezierPath bezierPathWithRoundedRect:imageView.bounds cornerRadius:cornerRadius] addClip]; [image drawInRect:imageView.bounds]; UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return finalImage; } 

Извините за уродливое форматирование. Лучшая версия ответа aToz.

 @interface UIImage (CircleMask) + (UIImage *)roundedRectImageFromImage :(UIImage *)image size :(CGSize)imageSize withCornerRadius :(float)cornerRadius; @end @implementation UIImage(CircleMask) +(UIImage*)roundedRectImageFromImage:(UIImage *)image size:(CGSize)imageSize withCornerRadius:(float)cornerRadius { UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0.0); // <= notice 0.0 as third scale parameter. It is important cause default draw scale ≠ 1.0. Try 1.0 - it will draw an ugly image.. CGRect bounds=(CGRect){CGPointZero,imageSize}; [[UIBezierPath bezierPathWithRoundedRect:bounds cornerRadius:cornerRadius] addClip]; [image drawInRect:bounds]; UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return finalImage; } @end 

То же самое в Swift:

 extension UIImage{ class func roundedRectImageFromImage(image:UIImage,imageSize:CGSize,cornerRadius:CGFloat)->UIImage{ UIGraphicsBeginImageContextWithOptions(imageSize,false,0.0) let bounds=CGRect(origin: CGPointZero, size: imageSize) UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius).addClip() image.drawInRect(bounds) let finalImage=UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return finalImage } } 

Лучшая версия ответов aToz и fnc12 (в Swift):

 extension UIImage { func roundImage() -> UIImage { let newImage = self.copy() as! UIImage let cornerRadius = self.size.height/2 UIGraphicsBeginImageContextWithOptions(self.size, false, 1.0) let bounds = CGRect(origin: CGPointZero, size: self.size) UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius).addClip() newImage.drawInRect(bounds) let finalImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return finalImage } } 

Применение:

 self.userImageView.image = image.roundedImage() 

Как получить помощь от UIImageView

 + (UIImage *)circularImage:(UIImage *)image withDiameter:(NSUInteger)diameter { CGRect frame = CGRectMake(0.0f, 0.0f, diameter, diameter); UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame]; imageView.contentMode = UIViewContentModeScaleAspectFill; imageView.clipsToBounds = YES; imageView.image = image; CALayer *layer = imageView.layer; layer.masksToBounds = YES; layer.cornerRadius =MAX( imageView.frame.size.height,imageView.frame.size.width)/2; UIGraphicsBeginImageContextWithOptions(imageView.bounds.size,NO, [UIScreen mainScreen].scale); CGContextRef context = UIGraphicsGetCurrentContext(); [layer renderInContext:context]; UIImage *roundedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return roundedImage; } 

Если вы используете UIImageView и ищете анимацию размера изображения при сохранении закругленных углов, вы можете применить преобразование следующим образом:

Objective-C

 // Our UIImageView reference @property (weak, nonatomic) IBOutlet UIImageView *myImageView; - (void)viewDidLoad { [super viewDidLoad]; myImageView.layer.cornerRadius = myImageView.frame.size.width / 2.0f; myImageView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.4f, 0.4f); } - (void)viewDidAppear:(BOOL)animated { [UIView animateWithDuration:1.0 animations:^{ myImageView.transform = CGAffineTransformIdentity; }]; } 

стриж

 // Our UIImageView reference @IBOutlet weak var myImageView:UIImageView! override func viewDidLoad() { super.viewDidLoad() myImageView.layer.cornerRadius = myImageView.frame.size.width / 2; myImageView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.4, 0.4) } override func viewDidAppear(animated: Bool) { UIView.animateWithDuration(1.0) { myImageView.transform = CGAffineTransformIdentity; } } 

ПРИМЕЧАНИЕ. Это также будет поддерживать любые constraints AutoLayout .

Если вы используете Swift, вы можете импортировать «AlamofireImage» и использовать одну из своих функций. Для обведенного изображения:

 let roundImage = UIImage(named: "myImage")!.af_imageRoundedIntoCircle() 

попробуй это

 UIImageView *circleImageview=[[UIImageView alloc]init]; circleImageview.frame=CGRectMake(0,10, 80, 80)]; circleImageview.layer.cornerRadius=circleimagview.frame.size.height/2; circleImageview.userInteractionEnabled=YES; [self.view addSubview:circleImageview]; 

Примечание. Убедитесь, что высота и ширина будут одинаковыми для этого вида.

Я разрешаю свою проблему с UIBezierPath

 UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:yourImageView.bounds]; CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.path = path.CGPath; yourImageView.layer.mask = maskLayer; 
  • `` соглашение
  • Как установить плагин Xcode для автоматического форматирования кода
  • Как использовать метод prepareForReuse
  • Установка UIDatePicker в таблицу UIActionSheet
  • Как распознать салфетки во всех четырех направлениях?
  • UITextField: перемещение вида при появлении клавиатуры
  • iPhone - Что такое reuseIdentifiers (UITableViewCell)?
  • Как я могу «разрезать» прозрачное отверстие в UIImage?
  • Убедитесь, что вход в UITextField только числовой
  • как сделать программный снимок экрана для iPhone?
  • Почему NSError нуждается в двойной косвенности? (указатель на указатель)
  • Interesting Posts

    Google Chrome не воспроизводит файлы mp4

    В чем разница между CSV (MS-Dos), CSV (Macintosh), CSV (с разделителями-запятыми)

    Как паровая соль помогает против атаки радужного стола?

    Неактивность и активность WPF

    Алгоритм для поиска числовой перестановки с учетом лексикографического индекса

    Какой алгоритм можно использовать для упаковки прямоугольников разного размера в самый маленький прямоугольник, который может быть достаточно оптимальным?

    Использование компонента Sessionful Session для отслеживания сеанса пользователя

    Почему -INT_MIN = INT_MIN в подписанном представлении дополнений двух?

    CSS: чистая анимация прокрутки CSS

    Запрещен ли указатель на «внутреннюю структуру»?

    Weird Wifi проблема в Windows

    Отключить приложение Mail в Windows 8.1

    Владелец изменения силы в папке пользователя Windows 7

    Google Chrome не сохраняет пароли (а не автоматически заполняет существующие логины / пароли)

    Что такое исключение «индекс вне диапазона» и как его исправить?

    Давайте будем гением компьютера.