КВО, связывающий 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)"
}
}