2013-08-14 1 views
2

Je dessine des annotations sur une vue. L'annotation de ligne provoque un problème.Redimensionner la ligne à partir des points de terminaison

J'ai une classe parente de Shape (étendue à partir de UIView). Toutes les annotations sont des sous-classes de forme. Dans chaque classe d'annotation, j'ai surchargé la méthode drawRect. DrawingCanvas class (étendu à partir de UIView et est une sous-vue de la vue parent de mon viewController) gère le mouvement de panoramique. Voici un morceau de code

-(void) panGestureRecognizer: (UIPanGestureRecognizer *) panGesture { 

    static CGPoint initialPoint; 
    CGPoint translation = [panGesture translationInView:panGesture.view]; 
    static Shape *shape; 

    if(panGesture.state == UIGestureRecognizerStateBegan) { 

     initialPoint = [panGesture locationInView:panGesture.view]; 

     if(selectedShape == nil) { 

      if([selectedOption isEqualToString:@"line"]) { 
       shape = [[Line alloc] initWithFrame:CGRectMake(initialPoint.x, initialPoint.y, 10, 10) isArrowLine:NO]; 
       ((Line *)shape).pointStart = [panGesture.view convertPoint:initialPoint toView:shape]; 
      } 
      [panGesture.view addSubview:shape]; 
     } 
     [shape setNeedsDisplay]; 
    } 
    else if(panGesture.state == UIGestureRecognizerStateChanged) { 

     if([shape isKindOfClass:[Line class]]) { 

      CGRect newRect = shape.frame; 

      if (translation.x < 0) { 
       newRect.origin.x = initialPoint.x + translation.x - LINE_RECT_OFFSET; 
       newRect.size.width = fabsf(translation.x) + LINE_RECT_OFFSET * 2; 
      } 
      else { 
       newRect.size.width = translation.x + LINE_RECT_OFFSET * 2; 
      } 

      if (translation.y < 0) { 
       newRect.origin.y = initialPoint.y + translation.y - LINE_RECT_OFFSET; 
       newRect.size.height = fabsf(translation.y) + LINE_RECT_OFFSET * 2; 
      } 
      else { 
       newRect.size.height = translation.y + LINE_RECT_OFFSET * 2; 
      } 

      shape.frame = newRect; 

      CGPoint endPoint = CGPointMake(initialPoint.x + translation.x, initialPoint.y + translation.y); 

      ((Line *)shape).pointStart = [panGesture.view convertPoint:initialPoint toView:shape]; 
      ((Line *)shape).pointEnd = [panGesture.view convertPoint:endPoint toView:shape]; 

      [shape setNeedsDisplay]; 
     } 
    } 
} 

ligne drawRect contient

-(void)drawRect:(CGRect)rect { 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextClearRect(context, rect); 

    CGContextSetStrokeColorWithColor(context, self.color.CGColor); 
    CGContextSetFillColorWithColor(context, self.color.CGColor); 

    CGContextMoveToPoint(context, pointStart.x, pointStart.y); 
    CGContextAddLineToPoint(context, pointEnd.x, pointEnd.y); 

    CGContextSetLineWidth(context, 2.f); 

    CGContextStrokePath(context); 
} 

Pour le déplacement et le redimensionnement je suis manutention touchEvents Pour déplacer l'annotation je fais ceci dans touchesMoved

UITouch *touch = [[event allTouches] anyObject]; 
CGPoint newPoint = [touch locationInView:self]; 
CGPoint previousPoint = [touch previousLocationInView:self]; 

CGRect rect = self.frame; 
rect.origin.x += newPoint.x - previousPoint.x; 
rect.origin.y += newPoint.y - previousPoint.y; 
self.frame = rect; 

[self setNeedsDisplay]; 

Il est tout bien jusqu'à ici, mais maintenant pour redimensionner la ligne en faisant glisser les extrémités de celui-ci crée la confusion pour moi. J'ai placé à imageViews au point final. On touche commencé je suis détecter le point final comme celui-ci

UITouch *touch = [[event allTouches] anyObject]; 
CGPoint touchPoint = [touch locationInView:self]; 
if(CGRectContainsPoint(imageView1.frame, touchPoint) || CGRectContainsPoint(imageView2.frame, touchPoint)) { 
    isEndPoint = YES; 
} 

si isEndPoint est OUI, je dois redimensionner la ligne. J'ai besoin de savoir dans quelle direction je traîne. comment mettre à jour les points (j'ai pris pour classer les variables de CGPoint; pointStart, pointEnd) et le cadre.

Veuillez suggérer l'astuce de redimensionnement pour mettre à jour les points et la trame.

+0

avez-vous trouvé une solution à cela .. si oui, une idée serait utile – inox

Répondre

0

Pour déterminer la direction de la ligne:
Vous pouvez effectuer les opérations suivantes:

ligne à partir de Point de départ:
a) Greater 'X' than the Start Point's X ligne approche vers le côté droit
b) Less 'X' than the Start Point's X ligne approche du côté gauche.
c) Greater Y'' than the Start point's 'Y' La ligne descend.
d) Less 'Y' than the Start point's 'Y' La ligne va vers le haut.

ligne à partir de End Point:
a) Greater 'X' than the End Point's X ligne se rapproche vers le côté droit
b) la ligne Less 'X' than the End Point's X approche sur le côté gauche.
c) Greater Y'' than the End point's 'Y' La ligne descend.
d) Less 'Y' than the End point's 'Y' La ligne va vers le haut.

Si la ligne est dessinée à partir du point de fin, gardez le point de départ inchangé, sinon, si la ligne commence à partir du point de départ, gardez le point de départ inchangé. Après le dessin de la ligne, il suffit de mettre à jour le rectangle de la ligne.
Pour cela, vous devez ajouter 2 autres propriétés CGPoint à la classe de la ligne.
1. Point initial, 2. Dernier point.
Initialement, définissez le point initial équivalent au point de départ et définissez initialement le dernier point équivalent au point de fin.
Ensuite, sur chaque ligne ajoutée au courant Line, il suffit de mettre à jour ces 2 propriétés en les comparant correctement aux points de départ et de fin. Je vous donne un soupçon de comparaisons appropriées:
Par exemple:
Comparez tous les 4 points qui est Initial Point, Last Point, Start Point et End Point.

Mise à jour point initial et dernier point:
Réglez le Initial Point's 'X' et 'Y' équivalent au minimum 'X' et minimum 'Y' entre tous ces 4 points.
Définissez Last Point's 'X' et 'Y' équivalent au maximum 'X' et au maximum 'Y' parmi ces 4 points.
Faire le Rect de la Ligne selon ces 2 points Initial Point et Last Point.
J'espère que cela résout votre problème.

Questions connexes