У CGPathMoveToPoint есть проблемы с созданием пути

Я использую следующий код для создания пути из массива CGPoint().

public func creatPath (for points:[CGPoint]) {
    let path = CGMutablePath()
    let startPoint = points.first

    CGPathMoveToPoint( path, CGAffineTransform.identity, startPoint.x, startPoint.y)

    var index = 0
    for point in points {
        if index == 0 { continue }
        CGPathAddLineToPoint(path, nil, points.x, points.y)
        index += 1
    }
    path.closeSubpath()
}

Но это всегда заканчивается тем, что мне показывают следующую ошибку:

nil несовместим с ожидаемым типом аргумента UnsafePointer <CGAffineTransForm>

Я также пытался использовать CGAffineTransform.identity Затем он показывает:

Не удается преобразовать значение типа CGAffineTransform в ожидаемый тип аргумента UnsafePointer<CGAffineTransform>.

Я не уверен, что еще мы можем здесь использовать. Я использую бета-версию Xcode8 6. Swift 3.0.

Изменить: Когда я пытаюсь: -

var transform = CGAffineTransform.identity as CGAffineTransform;
CGPathMoveToPoint( path, &transform, startPoint.x, startPoint.y)

Это показывает:

'CGPathMoveToPoint' недоступен: используйте move(to:transform:)

И при попытке:

CGPathMoveToPoint( path, NSNull(), startPoint.x, startPoint.y)

Ошибка: невозможно преобразовать значение типа NSNull в ожидаемый тип аргумента UnsafePointer.


person rptwsthi    schedule 05.09.2016    source источник
comment
Это потому, что в Objective-C мы делаем: CGAffineTransform transform = CGAffineTransformIdentity; CGPathAddLineToPoint(path, &transform, point.x, point.y); с материалом &var. Если вы хотите передать NULL, по-видимому, вы можете сделать так: stackoverflow.com/a/27169902/1801544 (я не не говорю на Swift, я просто указываю на возможные решения/подсказки).   -  person Larme    schedule 05.09.2016


Ответы (1)


Swift 3 имеет значительно улучшенный объектно-ориентированный интерфейс для CGMutablePath. Лучше всего то, что параметр transform имеет значение по умолчанию и может быть опущен.

public func creatPath (for points:[CGPoint]) {
    let path = CGMutablePath()
    let startPoint = points.first

    path.move(to: startPoint)

    var index = 0
    for point in points {
        if index == 0 { continue }
        path.addLine(to: point)
        index += 1
    }
    path.closeSubpath()
}

Примечание. Я изменил переменную цикла с points на point, чтобы избежать конфликта с именем параметра.

Обновить

Вы можете упростить свой код:

public func creatPath (for points:[CGPoint]) {
    let path = CGMutablePath()
    path.addLines(between: points)
    path.closeSubpath()
}
person Codo    schedule 05.09.2016
comment
Это замечательно. Огромное спасибо за помощь! Где я могу получить документацию Swift3? Как developer.apple. com/library/mac/documentation/GraphicsImaging/ все еще есть для Swift2.x, я думаю. - person rptwsthi; 05.09.2016
comment
Я также запутался в документации, так как там есть старая и новая. Взгляните на CGMutablePath — Core Graphics. Он охватывает синтаксис Swift 3, но практически не содержит описания. - person Codo; 05.09.2016