Zeichnen Sie eine Linie mit einem CALayer
Ich versuche zu zeichnen eine Linie zwischen zwei Punkten mit einem CALayer. Hier ist mein code:
//positions a CALayer to be a line between a parent node and its subnodes.
-(void)makeLineLayer:(CALayer *)layer lineFromPointA:(CGPoint)pointA toPointB:(CGPoint)pointB{
NSLog([NSString stringWithFormat:@"Coordinates: \n Ax: %f Ay: %f Bx: %f By: %f", pointA.x,pointA.y,pointB.x,pointB.y]);
//find the length of the line:
CGFloat length = sqrt((pointA.x - pointB.x) * (pointA.x - pointB.x) + (pointA.y - pointB.y) * (pointA.y - pointB.y));
layer.frame = CGRectMake(0, 0, 1, length);
//calculate and set the layer's center:
CGPoint center = CGPointMake((pointA.x+pointB.x)/2, (pointA.y+pointB.y)/2);
layer.position = center;
//calculate the angle of the line and set the layer's transform to match it.
CGFloat angle = atan2f(pointB.y - pointA.y, pointB.x - pointA.x);
layer.transform = CATransform3DMakeRotation(angle, 0, 0, 1);
}
Ich weiß, dass die Länge wird korrekt berechnet, und ich bin ziemlich sicher, dass der center auch. Wenn ich es laufen Linien angezeigt, die richtige Länge und den pass durch den Mittelpunkt zwischen den beiden Punkten, aber sind nicht richtig gedreht. Zuerst dachte ich, dass die Linie wurde gedreht um den falschen Ankerpunkt, so habe ich getan: layer.anchorPoint = center;
, aber dieser code nicht zeigen, irgendwelche Linien auf dem Bildschirm. Was mache ich falsch
Der Ankerpunkt ist in der Einheit Koordinatenraum (x-und y geht von 0 bis 1). Dies bedeutet, dass ein Ankerpunkt zentriert ist (0.5, 0.5), unabhängig von der Größe und dem Seitenverhältnis der Ebene.
Ok, damit
Ok, damit
layer.anchorPoint = center;
setzt den Ankerpunkt an eine etwas weiter Weg, und die rotation wäre irgendwo weit jenseits der Bindungen der Bildschirm...macht Sinn, dass es nicht angezeigt wird. Haben Sie eine Idee, was das problem sein könnte?InformationsquelleAutor 67cherries | 2014-02-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, Diese...
InformationsquelleAutor Rajesh Choudhary
Hier ist ein Swift-version, basierend auf Rajesh Choudhary's Antwort:
Swift 2
Swift 3
InformationsquelleAutor yuji
Hier ist ein Swift-3-version basiert auf Rajesh Choudhary's Antwort:
InformationsquelleAutor Yi Jiang