Cut a UIImage into a circle

后端 未结 11 2302
面向向阳花
面向向阳花 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 14:05

    Xcode 8.1, Swift 3.0.1

    My code will look like this:

    let image = yourImage.resize(CGSize(width: 20, height: 20))?.circled(forRadius: 20)
    

    Add UIImage Extension, then:

    func resize(_ size: CGSize) -> UIImage? {
        let rect = CGRect(origin: .zero, size: size)
        return redraw(in: rect)
    }
    
    func redraw(in rect: CGRect) -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(rect.size, false, UIScreen.main.scale)
    
        guard let context = UIGraphicsGetCurrentContext(), let cgImage = cgImage else { return nil }
    
        let rect = CGRect(origin: .zero, size: size)
        let flipVertical = CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: rect.size.height)
    
        context.concatenate(flipVertical)
        context.draw(cgImage, in: rect)
    
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
    
    func circled(forRadius radius: CGFloat) -> UIImage? {
        let rediusSize = CGSize(width: radius, height: radius)
        let rect = CGRect(origin: .zero, size: size)
    
        UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale)
    
        guard let context = UIGraphicsGetCurrentContext(), let cgImage = cgImage else { return nil }
    
        let flipVertical = CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: rect.size.height)
        context.concatenate(flipVertical)
    
        let bezierPath = UIBezierPath(roundedRect: rect, byRoundingCorners: [.allCorners], cornerRadii: rediusSize)
        context.addPath(bezierPath.cgPath)
        context.clip()
    
        context.drawPath(using: .fillStroke)
        context.draw(cgImage, in: rect)
    
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    
        return image
    }
    

提交回复
热议问题