Форма CAShapeLayer не отображается

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

var shapeLayer = CAShapeLayer()
var color = UIColor.redColor()
var openPath = UIBezierPath()
var closedPath = UIBezierPath()
let points = [CGPoint(x: 30, y: 30), CGPoint(x: 90, y: 30), CGPoint(x: 90, y: 90), CGPoint(x: 90, y: 30), CGPoint(x: 30, y: 30)]
var firstTime = false

override func viewDidLoad()
{
    super.viewDidLoad()
    setOpenPath()
}

func setOpenPath()
{
    for number in points
    {
        if number != points.first
        {
           openPath.addLineToPoint(number)
        }

        if number == points.first
        {
            if firstTime == false
            {
                openPath.moveToPoint(number)
            }
            if firstTime == true
            {
                openPath.addLineToPoint(number)
                setClosePath()
            }
            firstTime = true
        }
    }
}

func setClosePath()
{
    firstTime = false
    closedPath.CGPath = CGPathCreateMutableCopy(openPath.CGPath)
    closedPath.closePath()
    setShapeLayer()
}

func setShapeLayer()
{
    shapeLayer.path = closedPath.CGPath
    shapeLayer.fillColor = UIColor.greenColor().CGColor
    shapeLayer.fillRule = kCAFillRuleNonZero
    self.view.layer.addSublayer(shapeLayer)
}

Если я заменю код внутри setOpenPath() кодом ниже, скрипт будет работать нормально.

openPath.moveToPoint(CGPoint(x: 30, y: 30))
openPath.addLineToPoint(CGPoint(x: 90, y: 30))
openPath.addLineToPoint(CGPoint(x: 90, y: 90))
openPath.addLineToPoint(CGPoint(x: 30, y: 90))
openPath.addLineToPoint(CGPoint(x: 30, y: 30))
setClosePath()

person hackintosh    schedule 17.01.2015    source источник


Ответы (1)


Ваши очки перепутались в массиве points. элемент с индексом 3 неверен по сравнению с вашим кодом ниже. Он не создает замкнутый путь. Правильные элементы

let points = [CGPoint(x: 30, y: 30), CGPoint(x: 90, y: 30), CGPoint(x: 90, y: 90), CGPoint(x: 30, y: 90), CGPoint(x: 30, y: 30)]

Также используйте условия else и упростите свой цикл следующим образом.

func setOpenPath()
{
    firstTime = true
    for number in points
    {
        if number != points.first
        {
            openPath.addLineToPoint(number)
        }
        else
        {
            if firstTime
            {
                openPath.moveToPoint(number)
            }
            else
            {
                openPath.addLineToPoint(number)
                setClosePath()
            }
            firstTime = false
        }
    }
}
person rakeshbs    schedule 17.01.2015