如何沿着路径/bezier曲线创建对象?换句话说,我如何在给定路径上创建几个uibutton,在相同路径上有一个给定的间隔?
我看过很多关于移动物体的问题。但我需要一个解决方案来创建它们。
我想沿着路径,为每X点/距离创建一个对象。这样的:
....@....@....@....@....
在本例中,对于每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)];
}