2015-12-16 19 views
9

In meiner Anwendung verwende ich ActiveLabel Fram Github.UILabel vertikale Ausrichtung

In diesem Fall zeigt mein Etikett nicht den Text in der Mitte des UILabel. Wenn ich ein normales UILabel benutze, funktioniert es gut, aber wenn ich es auf ein ActiveLabel setze, wird es so aussehen. enter image description here

(Bild wird im laufenden Betrieb genommen)

Ich denke, das ist der Code in irgendeiner Weise mit der Ausrichtung zu spielen:

/// add line break mode 
private func addLineBreak(attrString: NSAttributedString) -> NSMutableAttributedString { 
    let mutAttrString = NSMutableAttributedString(attributedString: attrString) 

    var range = NSRange(location: 0, length: 0) 
    var attributes = mutAttrString.attributesAtIndex(0, effectiveRange: &range) 

    let paragraphStyle = attributes[NSParagraphStyleAttributeName] as? NSMutableParagraphStyle ?? NSMutableParagraphStyle() 
    paragraphStyle.lineBreakMode = NSLineBreakMode.ByWordWrapping 
    if let lineSpacing = lineSpacing { 
     paragraphStyle.lineSpacing = CGFloat(lineSpacing) 
    } 

    attributes[NSParagraphStyleAttributeName] = paragraphStyle 
    mutAttrString.setAttributes(attributes, range: range) 

    return mutAttrString 
} 

ActiveLabel.swift

ActiveType.swift

Irgendwelche Ideen, wie Ich kann es in der Mitte wie folgt machen: enter image description here

(Bild von Storyboard genommen wird)

+0

Im Storyboard hinzufügen, vertikale und horizontale Einschränkungen für die übergeordnete Ansicht. Stellen Sie außerdem sicher, dass Sie dies in der Storyboard-Ansicht Any/Any tun. – Alex

+0

@Alex - Ich verwende in meiner Anwendung kein Auto-Layout. –

+1

Ah fair genug, darf ich fragen warum? Es löst eine Menge Probleme, anstatt manuell Einschränkungen zu erstellen. – Alex

Antwort

3

In ActiveLabel.swift ersetzen die drawTextInRect Methode mit

public override func drawTextInRect(rect: CGRect) { 
     let range = NSRange(location: 0, length: textStorage.length) 

     textContainer.size = rect.size 

     let usedRect = layoutManager.usedRectForTextContainer(textContainer) 

     let glyphOriginY = (rect.height > usedRect.height) ? rect.origin.y + (rect.height - usedRect.height)/2 : rect.origin.y 
     let glyphOrigin = CGPointMake(rect.origin.x, glyphOriginY) 

     layoutManager.drawBackgroundForGlyphRange(range, atPoint: glyphOrigin) 
     layoutManager.drawGlyphsForGlyphRange(range, atPoint: glyphOrigin) 
    } 

Ich habe gegabelt auch die Repo unter https://github.com/rishi420/ActiveLabel.swift

Wenn Sie den Repo herunterladen, denken Sie daran zu setzen verticalTextAlignmentCenter zu true

+0

Omg du bist ein Gott!:) Ein weiteres Problem mit ActiveLabel ist, dass minimale Schriftgröße nicht funktioniert, die Schriftgröße ändert sich nicht, wenn viele Wörter in der Zeichenfolge sind. Kannst du das auch reparieren? Ich möchte, dass der gesamte Text in das UILabel (Active Label) passt, und auch die Größe der Schriftart so anpassen, dass sie in das UILabel passt. –

+0

EDIT: Ich habe versucht, 'minimumScaleFactor = 1 'und' justsFontSizeToFitWidth = true' über die 'userInteractionEnabled = true' in der' private func setupLabel() ', aber das tat nichts. –

+0

@RoduckNickes :) über Ihre zweite Frage, gespalten Repo aktualisiert. Laden Sie das gegabelte Repo herunter. Verwende 'minFontSize'. Es gibt viel Raum für Verbesserungen im Repository. Jeder Körper fühlt sich frei, etwas beizutragen. –

0

Sie die Textalignment in dem Code wie folgt einstellen: showLab.textAlignment = NSTextAlignmentCenter;

Oder Sie können auch Storyboard oder xib verwenden, um zu sehen, was im Labor passieren, StoryBoard, wie Sie ich die zweite der Ausrichtung aussehen wählen, was Mitte in der Bezeichnung bedeutet

0

Werfen Sie einen Blick auf diesen Beitrag:

Programmatically Add CenterX/CenterY Constraints

Nun das Problem wird sein, wenn Sie ein Etikett bereits aus dem IB gezogen haben und dann versuchen, seine Position zu ändern. Der Code wird unterbrochen. Sie müssen das Label programmgesteuert erstellen und es dann in der Mitte festlegen.

Und sehr ernst, @Alex ist richtig. AutoLayout löst viele Probleme.