Заполните форму UIBezierPath полосами - PullRequest
0 голосов
/ 30 октября 2019

У меня есть класс, который рисует круг внутри представления. Я знаю, как заполнить круг, и знаю, как сделать так, чтобы круг был только контуром.

Я хочу заполнить круг полосами, чтобы нижний круг выглядел как контур с чередующимися полосамикрасные и белые, но белые полосы выглядят белыми только на белом фоне, потому что они представляют отсутствие цветовой заливки.

import UIKit

@IBDesignable
class Circle: UIView{
    override func draw(_ rect: CGRect){
        let radius = bounds.width / 4
        let centerY = (bounds.maxY - bounds.minY) / 2
        let centerX = (bounds.maxX - bounds.minX)/2
        let centerPoint = CGPoint(x: centerX, y: centerY)
        drawCircle(radius: radius, center: centerPoint)

    }

    private func drawCircle(radius: CGFloat, center: CGPoint){
        let path = UIBezierPath()
        path.addArc(withCenter: center, radius: radius, startAngle: 0, endAngle: 2*CGFloat.pi, clockwise: true)
        path.close()
        UIColor.red.set()
        path.lineWidth = 5.0
        path.stroke()
        //path.fill()
    }
}

enter image description here

1 Ответ

0 голосов
/ 30 октября 2019

Решение с использованием областей отсечения

import UIKit

@IBDesignable
class Circle: UIView{
    override func draw(_ rect: CGRect){
        let radius = bounds.width / 4
        let centerY = (bounds.maxY - bounds.minY) / 2
        let centerX = (bounds.maxX - bounds.minX)/2
        let centerPoint = CGPoint(x: centerX, y: centerY)
        drawCircle(radius: radius, center: centerPoint)


    }

    private func drawCircle(radius: CGFloat, center: CGPoint){
        let path = UIBezierPath()
        path.addArc(withCenter: center, radius: radius, startAngle: 0, endAngle: 2*CGFloat.pi, clockwise: true)
        path.close()
        UIColor.red.set()
        path.lineWidth = 5.0

        //////////////////////////The part the produces stripes ////////////////////
        let bounds = path.bounds

        let stripes = UIBezierPath()
        for x in stride(from: 0, to: bounds.size.width, by: 20){
            stripes.move(to: CGPoint(x: bounds.origin.x + x, y: bounds.origin.y ))
            stripes.addLine(to: CGPoint(x: bounds.origin.x + x, y: bounds.origin.y + bounds.size.height ))
        }
        stripes.lineWidth = 10

        path.addClip()
        stripes.stroke()        
        //////////////////////////////////////////////////////////////////////////
        path.stroke()
    }
}

enter image description here

...