2013-06-20 36 views
-1

如何沿路徑/ BezierCurve創建對象?換句話說,我怎樣才能沿給定的路徑創建多個UIButton,並沿着同一路徑給定間隔?如何沿路徑/ BezierCurve創建多個UIButton?

我見過很多關於移動物體的問題。但我需要一個解決方案來實際創建它們。

我想沿着路徑走,併爲每個X點/距離創建一個對象。像這樣:

[email protected]@[email protected]@.... 

在這種情況下,每4個點獲取一個位置,並在那裏創建一個UIButton。

+0

請澄清您的問題。你想沿路徑創建對象,但不能在屏幕上繪製它們?咦? – iwasrobbed

+0

我試圖沿路徑創建多個UIButton對象。這可能嗎?對於每個X點/距離,我需要返回X/Y位置,所以我可以創建它們。 – nmdias

+0

我希望能夠沿着該路徑返回一個動畫的X/Y位置,但我不知道如何告訴te動畫爲每個X點/距離觸發給定的選擇器,並返回位置同一時間。 – nmdias

回答

11

iOS沒有一個公共API,直接給你沿路徑間隔點。但是有一個迂迴的方式來做到這一點。假設你想沿着路徑上的點間隔X的距離。

首先,創建一個包含您的路徑的CGPathRef。 (你可以構建一個UIBezierPath如果你喜歡,然後獲取其CGPath屬性。)

然後,調用CGPathCreateCopyByDashingPath,使用{ X, X }破折號模式。例如:

static CGFloat const kSpace = 10; 
CGPathRef dashedPath = CGPathCreateCopyByDashingPath(path, NULL, 0, 
    (CGFloat const []){ kSpace, kSpace }, 2); 

這將返回一個包含多個子路徑的新路徑。每個子路徑是原始路徑的長度X段,並且沿着原始路徑與其相鄰的子路徑分開X距離。因此,子路徑的端點沿原始路徑以X長度間隔分隔。

因此,最後,使用CGPathApply枚舉虛線路徑,選擇端點並在那裏創建按鈕。首先,你會希望把它包在需要的模塊功能:

static void applyBlockToPathElement(void *info, const CGPathElement *element) { 
    void (^block)(const CGPathElement *) = (__bridge void (^)(const CGPathElement *))(info); 
    block(element); 
} 

void MyCGPathApplyBlock(CGPathRef path, void (^block)(const CGPathElement *element)) { 
    CGPathApply(path, (__bridge void *)(block), applyBlockToPathElement); 
} 

然後您可以應用發現每個子路徑端點,並創建一個按鈕有一個塊。假設你有一個名爲createButtonAtPoint:的方法,類似這樣的應該工作:

__block BOOL isInSubpath = NO; 
__block CGPoint subpathStart = CGPointZero; 
__block CGPoint currentPoint = CGPointZero; 
MyCGPathApplyBlock(dashedPath, ^(const CGPathElement *element) { 
    switch (element->type) { 
     case kCGPathElementMoveToPoint: 
      if (isInSubpath) { 
       [self createButtonAtPoint:currentPoint]; 
       isInSubpath = NO; 
      } 
      currentPoint = element->points[0]; 
      break; 

     case kCGPathElementCloseSubpath: 
      // This should not appear in a dashed path. 
      break; 

     case kCGPathElementAddLineToPoint: 
     case kCGPathElementAddQuadCurveToPoint: 
     case kCGPathElementAddCurveToPoint: 
      if (!isInSubpath) { 
       [self createButtonAtPoint:currentPoint]; 
       isInSubpath = YES; 
      } 
      int pointIndex = 
       element->type == kCGPathElementAddLineToPoint ? 0 
       : element->type == kCGPathElementAddQuadCurveToPoint ? 1 
       : /* element->type == kCGPathElementAddCurveToPoint ? */ 2; 
      currentPoint = element->points[pointIndex]; 
      break; 
    } 
}); 
+0

你完全理解我的問題。我仍然試圖繞過它,但你的解決方案看起來非常有前途!先生,謝謝你這麼好的回答。 – nmdias

+0

剛剛在我的代碼中完成了這個。好的上帝,我很驚訝你的代碼中沒有一個錯字,並且你很容易就想到了這一點。它工作完美!在我對API的瞭解之前,它還有一點點,我認爲我不會這麼做。再次感謝你! – nmdias

+0

謝謝。我在Xcode中編寫代碼以避免錯誤,然後將其複製到答案中。我不會說這很容易。這只是[我以前使用過這種技術](http://stackoverflow.com/a/13667092/77567)。 –

-1

你解決了你的問題了嗎?如果沒有,請參閱這個如果它可以幫助

//if the interval is kown as float, suggesting it named padding 

    //then you can 

    for(i=0;i<numOfPaddings;i++){ 
     //create a button 
     UIButton *aButton = [UIButton buttonWithType:UIButtonRoundRect/*I forgot how to spell,but it does not metter*/]; 
     //Set your button's position base on padding 
     [aButton setFrame:CGRectMake(padding+padding*i,20,50,20)]; 
    } 
+0

@rob mayoff對我的問題給出了完美的答案,但感謝您的幫助!乾杯=) – nmdias