Cut a UIImage into a circle

后端 未结 11 2275
面向向阳花
面向向阳花 2020-11-27 13:30

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 UIImage

11条回答
  •  野趣味
    野趣味 (楼主)
    2020-11-27 13:47

    UIImage extension:

    extension UIImage {
    
        func circularImage(size size: CGSize?) -> UIImage {
            let newSize = size ?? self.size
    
            let minEdge = min(newSize.height, newSize.width)
            let size = CGSize(width: minEdge, height: minEdge)
    
            UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
            let context = UIGraphicsGetCurrentContext()
    
            self.drawInRect(CGRect(origin: CGPoint.zero, size: size), blendMode: .Copy, alpha: 1.0)
    
            CGContextSetBlendMode(context, .Copy)
            CGContextSetFillColorWithColor(context, UIColor.clearColor().CGColor)
    
            let rectPath = UIBezierPath(rect: CGRect(origin: CGPoint.zero, size: size))
            let circlePath = UIBezierPath(ovalInRect: CGRect(origin: CGPoint.zero, size: size))
            rectPath.appendPath(circlePath)
            rectPath.usesEvenOddFillRule = true
            rectPath.fill()
    
            let result = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
    
            return result
        }
    
    }
    

    Usage:

    UIImageView:

    @IBDesignable class CircularImageView: UIImageView {
    
        override var image: UIImage? {
            didSet {
                super.image = image?.circularImage(size: nil)
            }
        }
    
    }
    

    UIButton:

    @IBDesignable class CircularImageButton: UIButton {
    
        override func setImage(image: UIImage?, forState state: UIControlState) {
            let circularImage = image?.circularImage(size: nil)
            super.setImage(circularImage, forState: state)
        }
    
    }
    

提交回复
热议问题