2015-06-22 22 views

Odpowiedz

25

Rozmiar ramki SKLabelNode można porównać z danym prostokątem. Jeśli przeskalujesz czcionkę proporcjonalnie do rozmiarów prostokąta etykiety i pożądanego prostokąta, możesz określić najlepszy rozmiar czcionki, aby wypełnić obszar w jak największym stopniu. Ostatnia linia wygodnie przenosi etykietę do środka prostokąta. (To może wyglądać poza centrum, jeśli tekst jest tylko krótkie znaki takie jak małe litery lub znaki interpunkcyjne).

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

Czy ktoś może dodać objc dla tego kodu. dzięki. – GeneCode

+0

Należy zauważyć, że może zajść potrzeba dodatkowego dopełnienia między węzłem etykiety a prostokątem. 'MIN (rect.size.width/(labelNode.frame.size.width + PADDING), rect.size.height/(labelNode.frame.size.height + PADDING));' – Wouter

1

Pisałem to dla szerokości, ale możesz dostosować ją do wysokości, aby pasowała do twojego CGRect. W tym przykładzie pg jest zainicjalizowanym kodem SKLabelNode za pomocą używanej czcionki. Argumenty to Twój ciąg i docelowa szerokość, a wynikiem jest rozmiar, który chcesz przypisać do swojego SKLabelNode. Oczywiście możesz również umieścić bezpośrednio swój SKLabelNode. Jeśli rozmiar jest zbyt duży, maksymalny rozmiar to 50, ale to jest osobiste.

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: Właściwie, po prostu sobie sprawę, że to było również napisane:

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 
    }