을 도울 수 있다면 아니,이 표시되면 아이폰 OS는 직접 당신에게 경로를 따라 간격 포인트를 제공하는 공개 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