2016-06-14 7 views
-2

Ich versuche, Text in einer UILabel-Ansicht automatisch zu formatieren. Der Text (z. B. "abcdefghij") enthält zehn Zeichen. Ich möchte es in einer einzigen Zeile anzeigen. Ich habe die Größenklasse und das automatische Layout aus praktischen Gründen deaktiviert und die folgenden Codes hinzugefügt, um den Text auf dem UILabel zu formatieren. Es sollte zehn Zeichen in einer Zeile enthalten, und die Breite des UILabels ist gleich der Breite des Geräts.Wie viel Pixel verbraucht ein Charakter in iOS?

let screenWidth = UIScreen.mainScreen().bounds.width 
    labelView.frame = CGRect(x: labelView.frame.origin.x, y: labelView.frame.origin.y, width: screenWidth, height: labelView.frame.height) 
    let string = "abcdefghij" 
    let stringLength = CGFloat(string.characters.count) 
    let characterSize = keyboardView.font.pointSize 
    let characterSpacing = (screenWidth - characterSize * stringLength)/stringLength 
    let content = NSAttributedString(string: string, attributes: [NSKernAttributeName: characterSpacing]) 
    keyboardView.attributedText = content 

Aber es stellt sich so heraus. The width of string is not equal to the screen

Ich denke, das einzige könnte hier falsch sein ist die pointSize. Es entspricht 13,8, während ich die Schriftgröße auf 17 setze. Ich verstehe es nicht. Gib mir bitte ein paar Hinweise. Danke für Ihre Aufmerksamkeit.

Mit Hilfe sizeWithAttributes und boundingRectWithSize(_:options:context:) habe ich endlich herausgefunden, wie es funktioniert. Aber mein ursprünglicher Zweck besteht darin, die 10 Zeichen in eine Zeile zu passen. Der Code sollte den Abstand zwischen den Zeichen berechnen und der gesamte Speicherplatz muss dieselbe Größe haben. Können Sie mir Ratschläge geben? This is what I want to make

+0

Sie wollen also die Breite der Zeichen berechnen? – luiyezheng

+3

'Ich habe die Größenklasse und Auto-Layout für die Bequemlichkeit ausgeschaltet '- schalten Sie sie wieder ein. Aus keinem anderen Grund als der Bequemlichkeit, keine große Nachschlagetabelle haben zu müssen, die Schriftart Gesicht + Größe mit Höhen kombiniert (und dann immer noch auf die Breite raten muss). – nhgrif

+0

Die Antwort ist "es hängt von den Charakteren ab". iOS verwendet proportionale Schriftarten, so dass ein Buchstabe wie "I" viel weniger Platz benötigt als ein Buchstabe wie "W". Sie können 'sizeWithAttributes' verwenden - http://stackoverflow.com/questions/24141610/cgsize-sizewithattributes-in-swift – Paulw11

Antwort

1

Jedes Zeichen belegt je nach Zeichen, Schriftart und Schriftgröße unterschiedliche Abstände.

Daher können Sie boundingRectWithSize(_:options:context:) verwenden, um die Größe der Zeichenfolge zur Laufzeit vorherzusagen und dann entsprechend Ihren Anforderungen Maßnahmen zu ergreifen.

+0

Vielen Dank! Ich weiß wie es jetzt funktioniert. Aber mein ursprünglicher Zweck besteht darin, die 10 Zeichen in eine Zeile zu passen. Der Code sollte den Abstand zwischen den Zeichen berechnen und der gesamte Speicherplatz muss dieselbe Größe haben. Kannst du mir ein paar Ratschläge geben? – JsW

+0

Wie viele solcher Linien möchten Sie zeigen? Scheint, dass Sie eine CollectionView anstelle eines Labels verwenden müssen. Mit jedem Zeichen in einer Zelle eines Collectionveiw – 7vikram7