10
votes

Comment puis-je vérifier si un utilisateur a fourni près d'un CGPATH?

scénario:

J'ai un ensemble de cgpath code> s. Ils sont pour la plupart des lignes seulement (à savoir pas de formes fermées). Ils sont dessinés sur l'écran dans un UIView code> méthode de tirage. P>

Comment puis-je vérifier si l'utilisateur tapé près de l'un des chemins? P>

Voici ce que j'avais travail: p>

if (CGPathContainsPoint(clickArea,NULL,point,NO)) { ...


0 commentaires

3 Réponses :


2
votes

Eh bien, j'ai compris une réponse. Il utilise CGPATHAPPLY:

clickArea = CGPathCreateMutable();
CGPathApply(path,clickArea,&createClickArea);

void createClickArea (void *info, const CGPathElement *elem) {
  CGPathElementType type = elem->type;
  CGMutablePathRef path = (CGMutablePathRef)info;
  static CGPoint last;
  static CGPoint subpathStart;
  switch (type) {
    case kCGPathElementAddCurveToPoint:
    case kCGPathElementAddQuadCurveToPoint:
      break;
    case kCGPathElmentCloseSubpath:
    case kCGPathElementMoveToPoint: {
      CGPoint p = type == kCGPathElementAddLineToPoint ? elem->points[0] : subpathStart;
      if (CGPointEqualToPoint(p,last)) {
        return;
      }
      CGFloat rad = atan2(p.y - last.y, p.x - last.x);
      CGFloat xOff = CLICK_DIST * cos(rad);
      CGFloat yOff = CLICK_DIST * sin(rad);
      CGPoint a = CGPointMake(last.x - xOff, last.y - yOff);
      CGPoint b = CGPointMake(p.x + xOff, p.y + yOff);
      rad += M_PI_2;
      xOff = CLICK_DIST * cos(rad);
      yOff = CLICK_DIST * sin(rad);
      CGPathMoveToPoint(path, NULL, a.x - xOff, a.y - yOff);
      CGPathAddLineToPoint(path, NULL, a.x + xOff, a.y + yOff);
      CGPathAddLineToPoint(path, NULL, b.x + xOff, b.y + yOff);
      CGPathAddLineToPoint(path, NULL, b.x - xOff, b.y - yOff);
      CGPathCloseSubpath(path);
      last = p;
      break; }
    case kCGPathElementMoveToPoint:
      subpathStart = last = elem->points[0];
      break;
  }
}


1 commentaires

Merci beaucoup pour avoir posté ça! Je n'aurais pas moi-même un indice à ce sujet. Bien que la réponse acceptée fonctionne bien, mais cette fonction m'a essentiellement sauvé car il vous donne une flexibilité - je peux traiter des éléments de chemin de chemin différemment: exactement ce dont j'avais besoin. Merci encore!



23
votes

dans iOS 5.0 et plus tard, cela peut être fait plus simplement en utilisant cgpathCreatecopyBystrokingPath : xxx


1 commentaires

Dans Swift 3.0: Chemin.copy (CauseWithWithWidth: CGFLOAT ...)



0
votes

dans SWIFT

let area = stroke.copy(strokingWithWidth: 15, lineCap: .round, lineJoin: .round, miterLimit: 1)
if (area.contains(point)) { ... }


0 commentaires