iPhone comment puis-je faire deux lignes connectées à suivre à la position?

J'ai fait la queue de la bulle de la parole en utilisant le graphique de base et

La partie de queue du discours buble supposé aller à n'importe quel point comme je veux.

Le problème est quand la partie finale de la queue (la partie pointue) est vers le bas, cela fonctionne bien.

Mais quand la bulle est à l'envers, comme la partie bulle est en bas, la partie queue est sur

en haut, la ligne connectée de la partie de queue se croise et forme un X, quand il est censé être comme / \

peut someonle s'il vous plaît aidez-moi?

double angle(CGPoint p1, CGPoint p2) { //BOOL bRev = TRUE; double dx = p2.x - p1.x; double dy = p2.y - p1.y; if (dx == 0 && dy == 0) return 0.0 if (dy == 0) { if (dx > 0) return 0.0; else return M_PI; } if (dx == 0) { if (dy > 0) { double ang = M_PI/2.0; //if (bRev) ang = M_PI*2 - ang; return ang; } else { double ang = M_PI/2.0 * 3; //if (bRev) ang = M_PI*2 - ang; return ang; } } if (dx > 0) { if (dy > 0) { double ang = atan((double)dy/(double)dx); // 1사분면 //if (bRev) ang = M_PI*2 - ang; return ang; } else { double ang = atan((double)dy/(double)dx) + 2.0*M_PI; // 4사분면 //if (bRev) ang = M_PI*2 - ang; return ang; } } else { double ang = atan((double)dy/(double)dx) + M_PI; //if (bRev) ang = M_PI*2 - ang; return ang; } return 0.0; } - (double)degree:(CGPoint)p1 and:(CGPoint)p2 { double rad = angle(p1, p2); double deg = rad * 180.0 / M_PI; if (deg >= 360.0) deg = deg - 360.0; return (deg); } - (CGPoint)getPoint:(CGPoint)cPt Len:(int)len BaseDegree:(double)d1 MoveDegree:(double)d2 { double radian = 3.14/180.0; CGPoint pt1; pt1.x = cPt.x + len*cos((d2-d1)*radian); pt1.y = cPt.y - len*sin((d2-d1)*radian); return pt1; } - (void)drawRect:(CGRect)rect{ double degree1 = [self degree:CGPointMake(view.frame.origin.x(view.frame.size.width)/2, view.frame.origin.y+(view.frame.size.height)/2) and:lastPt]; CGPoint cpt = CGPointMake(view.frame.origin.x+(view.frame.size.width)/2, view.frame.origin.y+(view.frame.size.height)/2); CGPoint p1 = [self getPoint:cpt Len:10 BaseDegree:degree1 MoveDegree:90]; CGPoint p2 = [self getPoint:cpt Len:10 BaseDegree:degree1 MoveDegree:-90]; CGPathMoveToPoint(ctx, nil, p1.x, p1.y); CGPathAddLineToPoint(ctx, nil, lastPt.x, lastPt.y); CGPathAddLineToPoint(ctx, nil, lastPt.x-2, lastPt.y+2); CGPathAddLineToPoint(ctx, nil, lastPt.x-4, lastPt.y); CGPathAddLineToPoint(ctx, nil, p2.x, p2.y); } 

entrez la description de l'image ici

Dans votre code lorsque vous dessinez la ligne, vous calculez les points de début et de fin à droite, mais à la fin vous allez:

 CGPathAddLineToPoint(ctx, nil, lastPt.x, lastPt.y); CGPathAddLineToPoint(ctx, nil, lastPt.x-2, lastPt.y+2); CGPathAddLineToPoint(ctx, nil, lastPt.x-4, lastPt.y); 

Donc, vous dessinez toujours le minuscule v en bas / haut / côté de votre bulle comme une droite fixe v de gauche en haut, en bas au milieu, en haut à droite, quel que soit le path que vous dessinez.

Vous devez changer cela pour vous assurer que ces -2 / + 2 répondent de quelle façon vous êtes – par exemple, quand vous êtes à l'envers, cela devrait se terminer comme

 CGPathAddLineToPoint(ctx, nil, lastPt.x+4, lastPt.y); CGPathAddLineToPoint(ctx, nil, lastPt.x+2, lastPt.y-2); CGPathAddLineToPoint(ctx, nil, lastPt.x, lastPt.y); 

sauf qu'il devrait être calculé, pas seulement codé en dur.