2015-12-16 1 views
9

Dans mon application j'utilise ActiveLabel fram Github.UILabel alignement vertical

Dans ce cas, mon étiquette n'affiche pas le texte au milieu du UILabel. Si j'utilise un UILabel normal, cela fonctionne très bien, mais quand il est paramétré sur un ActiveLabel, c'est comme ça. enter image description here

(L'image est prise en exécution)

Je pense que c'est le code pour jouer avec l'alignement en quelque sorte:

/// 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

Toute idée comment Je peux le faire au milieu comme ceci: enter image description here

(image est tirée de Storyboard)

+0

En storyboard ajouter verticale et contraintes horizontales à la vue parent. Assurez-vous également que vous le faites dans la vue du storyboard Any/Any – Alex

+0

@Alex - Je n'utilise pas Auto Layout dans mon application. –

+1

Ah assez juste, puis-je demander pourquoi? Il résout beaucoup de maux de tête au lieu de créer manuellement des contraintes – Alex

Répondre

3

En ActiveLabel.swift remplacer la méthode drawTextInRect avec

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) 
    } 

J'ai aussi fourchue le repo sous https://github.com/rishi420/ActiveLabel.swift

Si vous téléchargez le repo, souvenez-vous de mettre verticalTextAlignmentCenter à true

+0

Omg vous êtes un dieu!:) Un autre problème avec ActiveLabel est que la taille de police minimale ne fonctionne pas, la taille de la police ne change pas s'il y a beaucoup de mots dans la chaîne. Pourriez-vous régler cela aussi? Je veux que tout le texte s'inscrive dans le UILabel (Active Label), et redimensionne également la police pour tenir dans le UILabel. –

+0

EDIT: J'ai essayé d'ajouter 'minimumScaleFactor = 1' et' ajustsFontSizeToFitWidth = true' sur 'userInteractionEnabled = true' dans le 'func func labelLabel()' mais cela n'a rien fait. –

+0

@RoduckNickes :) à propos de votre deuxième question, repo fourchu mis à jour. Télécharger le formulaire de repo fourchu. utilisez 'minFontSize'. Il y a beaucoup de place pour l'amélioration dans le référentiel. N'importe quel corps se sentir libre de contribuer. –

0

Vous pouvez définir le TextAlignment dans le code comme ceci: showLab.textAlignment = NSTextAlignmentCenter;

Vous pouvez également utiliser Storyboard ou xib pour voir ce qui se passe dans le laboratoire, StoryBoard, que vous regardez choisir le deuxième d'alignement ce qui signifie milieu dans l'étiquette

0

Jetez un oeil à ce poste:

Programmatically Add CenterX/CenterY Constraints

Eh bien, le problème sera lorsque vous avez déjà fait glisser une étiquette du BI et que vous essayez de changer sa position. Le code va casser. Vous devrez créer l'étiquette par programme, puis la définir au centre.

Et très sérieusement, @Alex est correct. AutoLayout résout beaucoup de problèmes.