如何沿路徑/ BezierCurve創建對象?換句話說,我怎樣才能沿給定的路徑創建多個UIButton,並沿着同一路徑給定間隔?如何沿路徑/ BezierCurve創建多個UIButton?
我見過很多關於移動物體的問題。但我需要一個解決方案來實際創建它們。
我想沿着路徑走,併爲每個X點/距離創建一個對象。像這樣:
[email protected]@[email protected]@....
在這種情況下,每4個點獲取一個位置,並在那裏創建一個UIButton。
如何沿路徑/ BezierCurve創建對象?換句話說,我怎樣才能沿給定的路徑創建多個UIButton,並沿着同一路徑給定間隔?如何沿路徑/ BezierCurve創建多個UIButton?
我見過很多關於移動物體的問題。但我需要一個解決方案來實際創建它們。
我想沿着路徑走,併爲每個X點/距離創建一個對象。像這樣:
[email protected]@[email protected]@....
在這種情況下,每4個點獲取一個位置,並在那裏創建一個UIButton。
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;
}
});
你解決了你的問題了嗎?如果沒有,請參閱這個如果它可以幫助
//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)];
}
@rob mayoff對我的問題給出了完美的答案,但感謝您的幫助!乾杯=) – nmdias
請澄清您的問題。你想沿路徑創建對象,但不能在屏幕上繪製它們?咦? – iwasrobbed
我試圖沿路徑創建多個UIButton對象。這可能嗎?對於每個X點/距離,我需要返回X/Y位置,所以我可以創建它們。 – nmdias
我希望能夠沿着該路徑返回一個動畫的X/Y位置,但我不知道如何告訴te動畫爲每個X點/距離觸發給定的選擇器,並返回位置同一時間。 – nmdias