2017-01-23 85 views
2

當用戶沿着一條線跡線時,一條SKShapeNode路徑由線段(來自底層的「貼圖」)構建。爲什麼SKShapeNode撕裂?

var activatedPointPath: UIBezierPath { 
    let activatedPointPath = UIBezierPath() 

    // self.state.activatedPoints contains the end point 
    // of each full line segment the user has traced through 
    if let firstActivatedPoint = self.state.activatedPoints.first { 
     activatedPointPath.move(to: firstActivatedPoint) 
     for activatedPoint in self.state.activatedPoints { 
      activatedPointPath.addLine(to: activatedPoint) 
     } 
     // self.state.endOfLine contains the last point the user 
     // has touched, which may or may not be at the end of a line 
     // segment 
     if let lastPoint = self.state.endOfLine { 
      activatedPointPath.addLine(to: lastPoint) 
     } 
    } 

    return activatedPointPath 
} 

然後這被分配到:實際的路徑是通過線鎖定用戶以前已經拖了過來,並找到在最接近線上的最近點到最新觸碰點,然後建立一個路徑,像這樣建所述SKShapeNode爲:

self.lineNode.path = self.activatedPointPath.cgPath 

然而,當用戶正在跟蹤線,先前的段閃爍與同時被繪製到屏幕上,像這樣的三角形丟失:

  solid line高於210個line with tear     line with tear

的圖像是從一個簡單的3×3塊網格允許用戶跟蹤一個簡單的直線:

wireframe of tiles

下面是一個更復雜的例子,其中該行開始上左下方和右上方結束:

more complex example with corners

什麼引起這些神器?

編輯,而我已經找到一個解決這個問題,我還是歡迎的原因,原來的代碼沒有工作,新的代碼做任何解釋。

+1

SKShapeNode是CAShapeLayer(我認爲),它是一個執行力差,半成品,WIP,包裝難以克服,不可變,不靈活,無生命,不值得花費時間的包裝。用拉伸和傾斜的SKSpriteNodes繪製這些線段。動畫時也會獲得更好的效果。 SKShapeNode的最初目的是將其用作物理調試繪圖工具,僅用於物理形狀...。只有在iOS 10中,他們才能夠以高性能的方式繪製輪廓,如果它沒有改變並且像紋理一樣對待。它可能在iOS 16中完成。 – Confused

回答

1

我對此問題的解決方法是更改​​activatedPointPath計算的變量,以便將線段組合在一起,而不是一次繪製線條。

新的代碼看起來是這樣的:

var previousPoint = firstActivatedPoint 
for activatedPoint in self.state.activatedPoints { 
    let newSegment = UIBezierPath() 
    newSegment.move(to: previousPoint) 
    newSegment.addLine(to: activatedPoint) 

    activatedPointPath.append(newSegment) 

    previousPoint = activatedPoint 
} 
if let lastPoint = self.state.endOfLine { 
    let newSegment = UIBezierPath() 
    newSegment.move(to: previousPoint) 
    newSegment.addLine(to: lastPoint) 
    activatedPointPath.append(newSegment) 
} else { 
    print("No last point") 
} 

現在產生線條流暢。

+0

...雖然它的工作原理,但效率非常低下。最後,我採用了Confused的建議,並將一些CALayer的形狀代替成了紋理。這具有原始的長時間繪製的副作用,能夠正確渲染。 – ReactiveRaven