2015-12-16 3 views
9

В моем приложении я использую ActiveLabel fram Github.UILabel вертикальное выравнивание

В этом случае моя метка не отображает текст в середине UILabel. Если я использую обычный UILabel, он отлично работает, но когда он настраивается на ActiveLabel, он выглядит следующим образом. enter image description here

(изображение берется во время выполнения)

Я думаю, что это код, чтобы играть с выравниванием как-то:

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

Любые идеи, как я могу сделать это посередине следующим образом: enter image description here

(Изображение взято из раскадровки)

+0

В раскадровке добавить вертикальные и горизонтальные ограничения для родительского представления. Также убедитесь, что вы делаете это в представлении Any/Any в режиме раскадровки. – Alex

+0

@Alex. Я не использую автоматический макет в своем приложении. –

+1

Ах, справедливо, позвольте спросить, почему? Он решает много головных болей вместо ручного создания ограничений. – Alex

ответ

3

В ActiveLabel.swift заменить метод drawTextInRect с

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

Я также раздвоенный репо под https://github.com/rishi420/ActiveLabel.swift

Если вы загрузили репозиторий, не забудьте установить verticalTextAlignmentCenter в true

+0

Омг ты бог!:) Еще одна проблема с использованием ActiveLabel заключается в том, что минимальный размер шрифта не работает, размер шрифта не изменяется, если в строке много слов. Не могли бы вы также исправить это? Я хочу, чтобы весь текст вписывался в UILabel (Active Label), а также изменял размер шрифта в соответствии с UILabel. –

+0

EDIT: Я попытался добавить 'minimumScaleFactor = 1' и' adjustsFontSizeToFitWidth = true' над 'userInteractionEnabled = true' в' private func setupLabel() ', но ничего не сделал. –

+0

@RoduckNickes :) о вашем втором вопросе, forked repo обновлен. Загрузите форму разветвленного репо. используйте 'minFontSize'. В репозитории много возможностей для улучшения. Любое тело не стесняется вносить свой вклад. –

0

Вы можете установить TextAlignment в коде следующим образом: showLab.textAlignment = NSTextAlignmentCenter;

Или вы можете также использовать раскадровку или XIB, чтобы увидеть, что происходит в лаборатории, StoryBoard, как вы смотрите я выбираю второе неровно, что означает середину в метке

0

Посмотрите на этот пост:

Programmatically Add CenterX/CenterY Constraints

Хорошо, проблема в том, что когда вы вытащили ярлык уже из IB, а затем вы пытаетесь изменить его положение. Код сломается. Вам необходимо программно сделать метку, а затем установить ее в центр.

И очень серьезно, @Alex правильный. AutoLayout решает много проблем.

Смежные вопросы