2015-02-02 9 views
8

Ich möchte die Schriftgröße eines Textes erhalten, nachdem er in einem UILabel oder UITextField verkleinert wurde. Dies war vor iOS 7.0 möglich: How to get UILabel (UITextView) auto adjusted font size?. SizeWithFont wurde jedoch in iOS 7.0 nicht mehr unterstützt. Ich habe versucht, seine Ersetzung, SizeWithAttributes, aber ohne Erfolg zu verwenden. Gibt es eine Möglichkeit, dies in iOS 7.0 zu tun?Wie kann ich die Schriftgröße in iOS 7.0 oder höher automatisch anpassen?

Antwort

2

Überprüfen Sie, nachdem der Text angewendet wurde (vielleicht erzwingen Sie eine Ansicht laden zuerst) Sie können die Schriftgröße greifen. Mit einem UITextField könnten Sie beispielsweise die Delegate-Methode für textDidChange implementieren und dann die Schriftgröße aus dem font-Attribut im textField ermitteln. Für ein Label könnten Sie den Text aktualisieren und dann die Schriftgröße überprüfen.

Beispiel baute ich ein Projekt, das eine UILabel aus einem

UITextField aktualisiert
-(void)textFieldDidEndEditing:(UITextField *)textField{ 

    self.label.text = textField.text; 

    CGSize initialSize = [_label.text sizeWithAttributes:@{NSFontAttributeName:_label.font}]; 
    while (initialSize.width > _label.frame.size.width) { 
     [_label setFont:[_label.font fontWithSize:_label.font.pointSize - 1]]; 
     initialSize = [_label.text sizeWithAttributes:@{NSFontAttributeName:_label.font}]; 
    } 
    CGFloat actualSize = _label.font.pointSize; 
    NSLog(@"acutal size %f",actualSize); 
} 

Die Actual rechts scheint. (size calculation source)

+0

Ich weiß, wie Auto, um Text zu verkleinern. Mein Problem ist, dass ich die Schriftgröße erhalten muss, nachdem die minimale Schriftgröße/Skalierung angewendet wurde. – WaltersGE1

+0

Ah, Entschuldigung. Ich werde die Antwort aktualisieren. – Jbryson

+0

Hmmmm, ich werde das versuchen. – WaltersGE1

8

Hier ist eine Funktion, die ich gemacht die eingestellte Schriftgröße eines UILabel zu bekommen:

Swift

func getApproximateAdjustedFontSizeWithLabel(label: UILabel) -> CGFloat { 

    if label.adjustsFontSizeToFitWidth == true { 

     var currentFont: UIFont = label.font 
     let originalFontSize = currentFont.pointSize 
     var currentSize: CGSize = (label.text! as NSString).sizeWithAttributes([NSFontAttributeName: currentFont]) 

     while currentSize.width > label.frame.size.width && currentFont.pointSize > (originalFontSize * label.minimumScaleFactor) { 
      currentFont = currentFont.fontWithSize(currentFont.pointSize - 1) 
      currentSize = (label.text! as NSString).sizeWithAttributes([NSFontAttributeName: currentFont]) 
     } 

     return currentFont.pointSize 

    } 
    else { 

     return label.font.pointSize 

    } 

} 

Objective-C

- (CGFloat)getApproximateAdjustedFontSizeWithLabel:(UILabel *)label { 

    if (label.adjustsFontSizeToFitWidth) { 

     UIFont *currentFont = label.font; 
     CGFloat originalFontSize = currentFont.pointSize; 
     CGSize currentSize = [label.text sizeWithAttributes:@{NSFontAttributeName : currentFont}]; 

     while (currentSize.width > label.frame.size.width && currentFont.pointSize > (originalFontSize * label.minimumScaleFactor)) { 
      currentFont = [currentFont fontWithSize:currentFont.pointSize - 1]; 
      currentSize = [label.text sizeWithAttributes:@{NSFontAttributeName : currentFont}]; 
     } 

     return currentFont.pointSize; 
    } 
    else { 

     return label.font.pointSize; 
    } 
} 
8

ich wirklich mochte @ WaltersGE1's Antwort, also habe ich es in eine Erweiterung für UILabel gemacht, um es noch mehr zu machen c onvenient zu verwenden:

extension UILabel { 

    /// The receiver’s font size, including any adjustment made to fit to width. (read-only) 
    /// 
    /// If `adjustsFontSizeToFitWidth` is not `true`, this is just an alias for 
    /// `.font.pointSize`. If it is `true`, it returns the adjusted font size. 
    /// 
    /// Derived from: [http://stackoverflow.com/a/28285447/5191100](http://stackoverflow.com/a/28285447/5191100) 
    var fontSize: CGFloat { 
     get { 
      if adjustsFontSizeToFitWidth { 
       var currentFont: UIFont = font 
       let originalFontSize = currentFont.pointSize 
       var currentSize: CGSize = (text! as NSString).sizeWithAttributes([NSFontAttributeName: currentFont]) 

       while currentSize.width > frame.size.width && currentFont.pointSize > (originalFontSize * minimumScaleFactor) { 
        currentFont = currentFont.fontWithSize(currentFont.pointSize - 1) 
        currentSize = (text! as NSString).sizeWithAttributes([NSFontAttributeName: currentFont]) 
       } 

       return currentFont.pointSize 
      } 

      return font.pointSize 
     } 
    } 
} 
+0

Danke. Es funktioniert, aber könnte/sollte optimiert werden, indem man die pointSize-Differenz jedes Mal halbiert, anstatt sie zu dekrementieren. – WaltersGE1

+2

Tolle Lösung, danke! – FiddleMeRagged

+0

Funktioniert nicht für mich. Gibt immer 0 zurück. Dies ist für den titleLabel innerhalb einer Schaltfläche. – qazimusab

0

Alle Lösungen bisher integer Schriftgrößen übernehmen und nicht UILabel ‚s minimumScaleFactor Eigentum zu respektieren.

So etwas sollte funktionieren:

+ (CGFloat)fontSizeForLabel:(UILabel *)label 
{ 
    if (label.adjustsFontSizeToFitWidth == NO || label.minimumScaleFactor >= 1.f) { 
     // font adjustment is disabled 
     return label.font.pointSize; 
    } 

    CGSize unadjustedSize = [_label.text sizeWithAttributes:@{NSFontAttributeName:_label.font}]; 
    CGFloat scaleFactor = label.frame.size.width/unadjustedSize.width; 

    if (scaleFactor >= 1.f) { 
     // the text already fits at full font size 
     return label.font.pointSize; 
    } 

    // Respect minimumScaleFactor 
    scaleFactor = MAX(scaleFactor, minimumScaleFactor); 

    CGFloat newFontSize = label.font.pointSize * scaleFactor; 

    // Uncomment this if you insist on integer font sizes 
    //newFontSize = floor(newFontSize); 

    return newFontSize; 
} 
Verwandte Themen