2014-12-21 2 views
5

Веселитесь с параметром alignmentMode в SCNText. Был googling вокруг, и похоже, что есть проблема с alignmentMode и containerFrame. Альтернативы, которые я нашел, предлагают использовать функцию ограничения границ, чтобы найти размер текста, а затем вручную настроить соответствующим образом. Отлично, если я не могу заставить функцию работать. Когда я пытаюсь получить два вектора я получаю сообщение об ошибке:Swift Scenekit - Центрирование SCNText - getBoundingBoxMin: Макс. Вопрос

«SCNVector3» не конвертируется в «UnsafeMutablePointer < SCNVector3>»

Я понимаю, что и от геометрии и узла. пример кода ниже

func setCounterValue(counterValue:Int) { 

    var v1 = SCNVector3(x: 0,y: 0,z: 0) 
    var v2 = SCNVector3(x: 0,y: 0,z: 0) 


    _counterValue = counterValue 

    let newText = SCNText(string: String(format: "%06d", counterValue), extrusionDepth:sDepth) 
    newText.font = UIFont (name: "Arial", size: 3) 
    newText.firstMaterial!.diffuse.contents = UIColor.whiteColor() 
    newText.firstMaterial!.specular.contents = UIColor.whiteColor() 

    newText.getBoundingBoxMin(v1, max: v2) 

    _textNode = SCNNode(geometry: newText) 
    _textNode.getBoundingBoxMin(v1, max: v2) 

} 

Любые предложения с благодарностью.

+0

есть известная ошибка с выравниванием текста на iOS, и она будет исправлена ​​в обновлении программного обеспечения. – mnuages

+0

можете ли вы опубликовать весь код для центрирования SCNtext вокруг своей оси? Благодарю. – SpaceDog

ответ

10

ИТАК мое окончательное решение кода выглядит следующим образом:

func setCounterValue(counterValue:Int) { 

    var v1 = SCNVector3(x: 0,y: 0,z: 0) 
    var v2 = SCNVector3(x: 0,y: 0,z: 0) 

    _textNode.removeFromParentNode() 
    _counterValue = counterValue 

    let newText = SCNText(string: String(format: "%08d", counterValue), extrusionDepth:sDepth) 
    newText.font = UIFont (name: "Arial", size: 3) 
    newText.firstMaterial!.diffuse.contents = UIColor.whiteColor() 
    newText.firstMaterial!.specular.contents = UIColor.whiteColor() 

    _textNode = SCNNode(geometry: newText) 
    _textNode.getBoundingBoxMin(&v1, max: &v2) 

    let dx:Float = Float(v1.x - v2.x)/2.0 
    let dy:Float = Float(v1.y - v2.y) 
    _textNode.position = SCNVector3Make(dx, dy, Float(sDepth/2)) 

    node.addChildNode(_textNode) 

} 

Я оставил в моей паре глобальных переменных, но должен иметь смысл.

Спасибо за помощь.

+1

Вау, почему все, что создает яблоко для разработчика, так дерьмово? удивительно. – SpaceDog

10

EDIT: функции с аргументами из-указателей всасывать Swift, поэтому в Swift 3 Apple, заменил этот метод (и соответствующий метод установки) с property whose type is a tuple:

var boundingBox: (min: SCNVector3, max: SCNVector3) { get set } 

Таким образом, вы можете просто написать что-то вроде:

let (min, max) = textNode.boundingBox 

Более общо ...

Функции, которые та ke out-parameter типа UnsafeMutablePointer в Swift можно вызвать, передав в качестве параметра ссылку inout. Таким образом, для версии Swift 2 этого метода, или для других аналогичных методов в других местах:

_textNode.getBoundingBoxMin(&v1, max: &v2) 
+0

Вот и все! Будет опубликован окончательный код ниже. –

+0

Это частная функция? Я вижу эту ошибку: Вы имели в виду '__getBoundingBoxMin'? (SceneKit.SCNNode) – user3246173

+0

Он изменился в Swift 3 - я отредактировал свой ответ соответственно. Возможно, вы захотите [указать ошибку] ​​(http://bugreport.apple.com), что ошибка компилятора не ссылается на новое свойство. – rickster

Смежные вопросы