如何沿路径/ BezierCurve创建多个UIButton?

时间:2013-06-20 23:05:16

标签: ios objective-c uibezierpath

如何沿路径/ BezierCurve创建对象?换句话说,如何沿给定路径创建多个UIButton,并沿同一路径给定间隔?

我看过很多关于移动物体的问题。但我需要一个实际创建它们的解决方案。

我想沿着路径前进并为每个X点/距离创建一个对象。像这样:

....@....@....@....@....

在这种情况下,每4个点,获取位置,并在那里创建一个UIButton。

2 个答案:

答案 0 :(得分: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;
    }
});

答案 1 :(得分:-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)];
  }
相关问题