add rounding for the outline swift

56 views Asked by At

I have a code that adds an outline of the required width and color to an image and it works well But I still need to adjust the rounding for the contour, please tell me in which direction should I start?

There are two functions here that do the job of laying the outline.

  func colorized(with color: UIColor = .white) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(size, false, scale)

    defer {
        UIGraphicsEndImageContext()
    }

    guard let context = UIGraphicsGetCurrentContext(), let cgImage = cgImage else { return self }


    let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)

    color.setFill()
    context.translateBy(x: 0, y: size.height)
    context.scaleBy(x: 1.0, y: -1.0)
    context.clip(to: rect, mask: cgImage)
    context.fill(rect)

    guard let colored = UIGraphicsGetImageFromCurrentImageContext() else { return self }

    return colored
}

/**
Returns the stroked version of the fransparent image with the given stroke color and the thickness.

- Parameters:
    - color: The colors to user. By defaut, uses the ``UIColor.white`
    - thickness: the thickness of the border. Default to `2`
    - quality: The number of degrees (out of 360): the smaller the best, but the slower. Defaults to `10`.

- Returns: the stroked version of the image, or self if something was wrong
*/

func stroked(with color: UIColor = .red, thickness: CGFloat = 2, quality: CGFloat = 10) -> UIImage {

    guard let cgImage = cgImage else { return self }

    // Colorize the stroke image to reflect border color
    let strokeImage = colorized(with: color)

    guard let strokeCGImage = strokeImage.cgImage else { return self }

    /// Rendering quality of the stroke
    let step = quality == 0 ? 10 : abs(quality)

    let oldRect = CGRect(x: thickness, y: thickness, width: size.width, height: size.height).integral
    let newSize = CGSize(width: size.width + 2 * thickness, height: size.height + 2 * thickness)
    let translationVector = CGPoint(x: thickness, y: 0)


    UIGraphicsBeginImageContextWithOptions(newSize, false, scale)

    guard let context = UIGraphicsGetCurrentContext() else { return self }

    defer {
        UIGraphicsEndImageContext()
    }
    context.translateBy(x: 0, y: newSize.height)
    context.scaleBy(x: 1.0, y: -1.0)
    context.interpolationQuality = .high

    for angle: CGFloat in stride(from: 0, to: 360, by: step) {
        let vector = translationVector.rotated(around: .zero, byDegrees: angle)
        let transform = CGAffineTransform(translationX: vector.x, y: vector.y)

        context.concatenate(transform)

        context.draw(strokeCGImage, in: oldRect)

        let resetTransform = CGAffineTransform(translationX: -vector.x, y: -vector.y)
        context.concatenate(resetTransform)
    }

    context.draw(cgImage, in: oldRect)

    guard let stroked = UIGraphicsGetImageFromCurrentImageContext() else { return self }

    return stroked
}

I tried many options but most of the answers are just adding a conerRadius to the UIImageView (this doesn't work)

0

There are 0 answers