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