Как стереть тонкую боковую линию справа внизу? - PullRequest
0 голосов
/ 04 февраля 2019

Я хочу составную форму вида из Овальной формы, вычитаем форму Rect,

, поэтому сначала я создаю изображение маски:

    let paths = CGMutablePath()
    //Oval shape path at left
    let leftPath = CGPath(ellipseIn: CGRect(x: 0, y: 0, width: 200, height: 150), transform: nil)

    //Rect shape path at right
    let rightPath = CGPath(roundedRect: CGRect(x: 100, y: 100, width: 120, height: 100), cornerWidth: 8, cornerHeight: 8, transform: nil)

    paths.addPath(leftPath)
    paths.addPath(rightPath)

    UIGraphicsBeginImageContext(CGSize(width: 220, height: 200))
    let ctx = UIGraphicsGetCurrentContext()

    ctx?.addPath(paths)
    ctx?.clip(using: .evenOdd)

    ctx?.addPath(leftPath.cgPath)
    ctx?.clip(using: .evenOdd)

    ctx?.setFillColor(UIColor.red.cgColor)
    ctx?.fill(CGRect(x: 0, y: 0, width: 220, height: 200))

    //the mask image
    let maskImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

далее Я использую это изображение для маски:

    let maskView = UIImageView(image: maskImage)
    maskView.contentMode = .center    
    imageView.mask = maskView

запустить приложение, я получаю это:

enter image description here

выглядит хорошо? Не очень ...

если вы посмотритеосторожно, вы заметите тонкую линию в правом нижнем углу

Это не нормально для меня!

Как стереть боковую линию ???Спасибо:)

1 Ответ

0 голосов
/ 04 февраля 2019

Нарисуйте эллипс, затем очистите скругленный прямоугольник.

import UIKit

let ellipse = CGPath(ellipseIn: CGRect(x: 0, y: 0, width: 200, height: 150), transform: nil)
let roundedRect = CGPath(roundedRect: CGRect(x: 100, y: 100, width: 120, height: 100), cornerWidth: 8, cornerHeight: 8, transform: nil)

let maskImage = UIGraphicsImageRenderer(size: CGSize(width: 220, height: 200)).image { rendererContext in
    let ctx = rendererContext.cgContext

    ctx.setFillColor(UIColor.red.cgColor)
    ctx.addPath(ellipse)
    ctx.fillPath()

    ctx.setBlendMode(.clear)
    ctx.addPath(roundedRect)
    ctx.fillPath()
}

Результат:

playground output

...