2014-12-21 3 views
5

SCNText에서 alignmentMode 옵션으로 재미있게 지냅니다. 정상적으로 검색하고 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) 

} 

모든 제안 사항을 매우 높이 평가합니다.

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

그래서 그냥 뭔가를 쓸 수 있습니다 :

+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에 애플이 property whose type is a tuple이 방법 (및 해당 setter 메소드를) 대체 있도록 밖으로 포인터 인수 기능, 스위프트 빨아 : 더 일반적으로

let (min, max) = textNode.boundingBox 

...

기능이 타 매개 변수로 inout 참조를 전달하면 Swift에서 UnsafeMutablePointer 유형의 out 매개 변수를 호출 할 수 있습니다. 그래서이 방법의 스위프트 2 버전, 또는 다른 유사한 방법에 대한 :

내 마지막 코드 솔루션처럼 보인다 있도록
_textNode.getBoundingBoxMin(&v1, max: &v2) 
+0

그게 다야! 아래에 최종 코드를 게시합니다. –

+0

개인 기능입니까? 이 오류가 표시됩니다. '__getBoundingBoxMin'을 원하셨습니까? (SceneKit.SCNNode) – user3246173

+0

Swift 3에서 변경되었습니다. 그에 따라 내 대답을 편집했습니다. 컴파일러 오류로 인해 새 속성을 참조하지 않는 [버그 신고] (http://bugreport.apple.com)가 필요할 수 있습니다. – rickster