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;
}
});
Просьба уточнить ваш вопрос. Вы хотите создавать объекты по пути, но не рисовать их на экране? А? – iwasrobbed
Я пытаюсь создать несколько объектов UIButton по пути. Это возможно? Для каждого X-точки/расстояния мне нужно вернуть положение X/Y, поэтому я могу их создать. – nmdias
Я надеялся, что смогу вернуть позицию X/Y анимацией по этому пути, но я не знаю, как бы я сказал, чтобы анимация запускала заданный селектор для каждой точки/расстояния X и возвращала позицию в в то же время. – nmdias