КВО, связывающий CGFloat на SCNNode

Я пытаюсь привязать положение узла - в данном случае мой узел pointOfView - к текстовому полю в macOS (но я думаю, что это будет то же самое на iOS)

Я могу связать (через .bind или раскадровка) например scnView.pointOfView.camera.fieldOfView, Но я не могу связать scnView.pointOfView.position.x

Я могу, однако, связать scnView.pointOfView.position, Но это не кажется полезным для текстового поля.

подробности

Вот что я получаю с

field.bind(.value, to: self, withKeyPath: "scnView.pointOfView.position.x", options: nil)

2019-01-11 11:54:13.987696+0100 Шаблон теста Scenekit [45791:1781975] Не удалось установить (contentViewController) проверенное пользователем определенное свойство для (NSWindow): [ valueForUndefinedKey:]: этот класс не соответствует значению ключа, соответствующему кодированию ключ х.

И здесь обязательна только .position

1 ответ

Вы всегда можете использовать преобразователь значения, чтобы получить определенный компонент составного значения. Что-то вроде этого:

field.bind(.value, to: self, withKeyPath: "scnView.pointOfView.position",
    options: [.valueTransformer: PositionXValueTransformer()])

Где ValueTransformer может выглядеть так:

class PositionXValueTransformer: ValueTransformer {
    override class func transformedValueClass() -> AnyClass {
        return NSString.self
    }

    override class func allowsReverseTransformation() -> Bool {
        return false
    }

    override func transformedValue(_ value: Any?) -> Any? {
        guard let position = value as? SCNVector3 else {
            return ""
        }

        return "\(position.x)"
    }
}
Другие вопросы по тегам