2014-12-21 68 views
5

在SCNText上使用alignmentMode選項很有趣。一直googling,它看起來像alignmentMode和containerFrame有問題。我找到的替代方案建議使用get bounding box函數來查找文本大小,然後相應地手動調整。偉大的除了我不能讓功能工作。當我試圖讓兩個向量我得到一個錯誤:Swift Scenekit - 居中SCNText - getBoundingBoxMin:Max問題

「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

OK,所以我的最終代碼解決方案的樣子:

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

編輯:函數與外指針參數吸斯威夫特,所以在斯威夫特3蘋果代替這種方法(和相應的setter方法)與property whose type is a tuple

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

所以,你可以只寫類似:

let (min, max) = textNode.boundingBox 

更一般...

功能是TA可以通過傳遞inout引用作爲參數來調用Swift中的UnsafeMutablePointer類型的外部參數。所以對於斯威夫特2版本的方法,或其他地方類似的方法:

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

就是這樣!將在下面發佈最終代碼。 –

+0

這是一個私人功能嗎?我看到這個錯誤: 您的意思是'__getBoundingBoxMin'? (SceneKit.SCNNode) – user3246173

+0

它在Swift 3中發生了變化 - 我相應地編輯了我的答案。不過,可能希望[提交錯誤](http://bugreport.apple.com)表示編譯器錯誤未引用新屬性。 – rickster