2015-06-22 5 views

Antwort

25

Die Größe des Rahmens des SKLabelNode kann mit dem gegebenen Rechteck verglichen werden. Wenn Sie die Schriftart im Verhältnis zu den Größen des Rechtecks ​​der Beschriftung und des gewünschten Rechtecks ​​skalieren, können Sie die beste Schriftgröße bestimmen, um den Platz so weit wie möglich zu füllen. Die letzte Zeile bewegt das Etikett bequem in die Mitte des Rechtecks. (Es kann nicht in der Mitte aussehen, wenn der Text nur kurze Zeichen wie Kleinbuchstaben oder Interpunktion.)

Swift

func adjustLabelFontSizeToFitRect(labelNode:SKLabelNode, rect:CGRect) { 

    // Determine the font scaling factor that should let the label text fit in the given rectangle. 
    let scalingFactor = min(rect.width/labelNode.frame.width, rect.height/labelNode.frame.height) 

    // Change the fontSize. 
    labelNode.fontSize *= scalingFactor 

    // Optionally move the SKLabelNode to the center of the rectangle. 
    labelNode.position = CGPoint(x: rect.midX, y: rect.midY - labelNode.frame.height/2.0) 
} 

Objective-C

-(void)adjustLabelFontSizeToFitRect:(SKLabelNode*)labelNode rect:(CGRect)rect { 

    // Determine the font scaling factor that should let the label text fit in the given rectangle. 
    double scalingFactor = MIN(rect.size.width/labelNode.frame.size.width, rect.size.height/labelNode.frame.size.height); 

    // Change the fontSize. 
    labelNode.fontSize *= scalingFactor; 

    // Optionally move the SKLabelNode to the center of the rectangle. 
    labelNode.position = CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect) - labelNode.frame.size.height/2.0); 
} 
+0

jemand Kann ObjC für diesen Code hinzufügen. Vielen Dank. – GeneCode

+0

Beachten Sie, dass Sie möglicherweise eine zusätzliche Auffüllung zwischen dem Label-Knoten und dem Rechteck wünschen. 'MIN (rect.size.width/(labelNode.frame.size.width + PADDING), rect.size.height/(labelNode.frame.size.height + PADDING));' – Wouter

1

ich geschrieben habe dies für die Breite, aber Sie können es an die Höhe anpassen, um zu Ihrem CGRect zu passen. In diesem Beispiel ist pg ein SKLabelNode, der mit der von Ihnen verwendeten Schriftart initialisiert wurde. Argumente sind Ihre Zeichenfolge und die Zielbreite, und das Ergebnis ist die Größe, die Sie Ihrem SKLabelNode zuweisen möchten. Natürlich können Sie auch Ihren SKLabelNode direkt eingeben. Wenn die Größe zu groß ist, dann ist die maximale Größe 50, aber das ist persönlich.

func getTextSizeFromWidth(s:String, w:CGFloat)->CGFloat { 

    var result:CGFloat = 0; 
    var fits:Bool = false 
    pg!.text=s 
    if(s != ""){ 
     while (!fits) { 
     result++; 
     pg!.fontSize=result 
     fits = pg!.frame.size.width > w; 
     } 
    result -= 1.0 
    }else{ 
     result=0; 
    } 

    return min(result, CGFloat(50)) 
} 

Edit: Eigentlich habe ich gerade realisiert hatte ich auch diese geschrieben:

extension SKLabelNode { 
func fitToWidth(maxWidth:CGFloat){ 
    while frame.size.width >= maxWidth { 
     fontSize-=1.0 
    } 
} 

func fitToHeight(maxHeight:CGFloat){ 
    while frame.size.height >= maxHeight { 
     fontSize-=1.0 
    }