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
Ü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)
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;
}
}
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
}
}
}
Danke. Es funktioniert, aber könnte/sollte optimiert werden, indem man die pointSize-Differenz jedes Mal halbiert, anstatt sie zu dekrementieren. – WaltersGE1
Tolle Lösung, danke! – FiddleMeRagged
Funktioniert nicht für mich. Gibt immer 0 zurück. Dies ist für den titleLabel innerhalb einer Schaltfläche. – qazimusab
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;
}
- 1. Schriftgröße automatisch anpassen
- 2. Wie kann ich die automatisch generierte index.html in appcelerator anpassen?
- 3. Wie kann ich die Kartenansicht mit Autoresizing in iOS anpassen?
- 4. Schriftgröße anpassen FPDF
- 5. Wie kann ich NSTextField mitteilen, dass es seine Schriftgröße automatisch an den Text anpassen soll?
- 6. Wie kann ich eine iOS-Alarmansicht anpassen?
- 7. Größe automatisch anpassen (Schriftgröße) beim Ändern der Fenstergröße?
- 8. Schriftgröße beim Drucken anpassen
- 9. Anpassen UIPickerView Schriftgröße
- 10. Wie kann ich die Schriftgröße in Xcode für swift erhöhen
- 11. Größe einer SKLabelNode Schriftgröße anpassen?
- 12. Wie ändere ich die Schriftgröße in EditText
- 13. Wie kann ich eine Textansicht erstellen, die automatisch die Schriftgröße an den Platz ändert?
- 14. horizontal CAGradientLayer in iOS 7.0
- 15. UITableViewRowAction Titel Schriftgröße anpassen in Swift
- 16. Wie kann ich den Löschbestätigungsdialog in Windows überschreiben oder anpassen?
- 17. Wie kann ich die JSON-Serialisierung anpassen?
- 18. Kind Element Schriftgröße dynamisch nach Elternhöhe anpassen
- 19. Wie kann ich die Schriftgröße in WebStorm erhöhen?
- 20. Auto Schriftgröße anpassen in Seaborn Heatmap
- 21. iOS Foundation: System Schriftgröße
- 22. MKMapView nicht Rendering in iOS 8 oder höher
- 23. automatisch anpassen die Outlook-Taskpane automatisch mit verschiedenen Bildschirmen
- 24. Wie ändert man die Schriftgröße in Auto Layout iOS dynamisch?
- 25. Text automatisch an die Breite einer Schaltfläche anpassen
- 26. Wie kann ich die Schriftgröße einer Textdatei in Eclipse
- 27. Wie NSTextField aussehen (Schriftart, Schriftgröße) in Cocoa anpassen?
- 28. Wie kann ich meine eigene Nib für die Symbolleiste in ChatViewController mit Quickblox anpassen oder verwenden?
- 29. Textarea Höhe automatisch anpassen
- 30. Wie ändere ich die Schriftgröße in jqGrid?
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
Ah, Entschuldigung. Ich werde die Antwort aktualisieren. – Jbryson
Hmmmm, ich werde das versuchen. – WaltersGE1