I want to cut a UIImage
into a circle so that I can then use it as an annotation. Every answer on this site that I've found describes creating an UIImageView
, then modifying that and displaying it, but you cant set the image of an annotation to an UIImageView
, only a UIImage
. How should I go about this?
UIImage contains the data for an image. UIImageView is a custom view meant to display the UIImage .
Xcode 11 • Swift 5.1 or later
edit/update: For iOS10+ We can use UIGraphicsImageRenderer. For older Swift syntax check edit history.
extension UIImage { var isPortrait: Bool { size.height > size.width } var isLandscape: Bool { size.width > size.height } var breadth: CGFloat { min(size.width, size.height) } var breadthSize: CGSize { .init(width: breadth, height: breadth) } var breadthRect: CGRect { .init(origin: .zero, size: breadthSize) } var circleMasked: UIImage? { guard let cgImage = cgImage? .cropping(to: .init(origin: .init(x: isLandscape ? ((size.width-size.height)/2).rounded(.down) : 0, y: isPortrait ? ((size.height-size.width)/2).rounded(.down) : 0), size: breadthSize)) else { return nil } let format = imageRendererFormat format.opaque = false return UIGraphicsImageRenderer(size: breadthSize, format: format).image { _ in UIBezierPath(ovalIn: breadthRect).addClip() UIImage(cgImage: cgImage, scale: format.scale, orientation: imageOrientation) .draw(in: .init(origin: .zero, size: breadthSize)) } } }
Playground Testing
let profilePicture = UIImage(data: try! Data(contentsOf: URL(string:"http://i.stack.imgur.com/Xs4RX.jpg")!))! profilePicture.circleMasked
Make sure to import QuarzCore if needed.
func maskRoundedImage(image: UIImage, radius: CGFloat) -> UIImage { let imageView: UIImageView = UIImageView(image: image) let layer = imageView.layer layer.masksToBounds = true layer.cornerRadius = radius UIGraphicsBeginImageContext(imageView.bounds.size) layer.render(in: UIGraphicsGetCurrentContext()!) let roundedImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return roundedImage! }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With