UILabel 垂直对齐

Posted

技术标签:

【中文标题】UILabel 垂直对齐【英文标题】:UILabel vertical alignment 【发布时间】:2015-12-16 01:14:25 【问题描述】:

在我的应用程序中,我使用的是ActiveLabelfram Github。

在这种情况下,我的标签不会显示 UILabel 中间的文本。如果我使用普通的 UILabel 它可以正常工作,但是当将它设置为 ActiveLabel 时,它会变成这样。

(图像是在运行时拍摄的)

我认为这是以某种方式进行对齐的代码:

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

任何想法我可以如何使它在中间是这样的:

(图片取自故事板)

【问题讨论】:

在情节提要中向父视图添加垂直和水平约束。还要确保您在 Any/Any 故事板视图中执行此操作 @Alex - 我没有在我的应用程序中使用自动布局。 啊,很公平,请问为什么?它解决了很多令人头疼的问题,而不是手动创建约束 @Alex - 自从我开始使用 xCode 以来,我从未使用过自动布局。我发现使用它要容易得多,而且我也从未遇到过这样的问题:) 祝你好运,先生,我建议你研究一下自动布局。我曾经手动定义我的约束,但自从我研究了自动布局后,我确实改进了我的工作流程,虽然每个都有自己的! 【参考方案1】:

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下分叉了repo

如果你下载了repo,记得把verticalTextAlignmentCenter设置成true

【讨论】:

天哪,你是神! :) 使用 ActiveLabel 的另一个问题是最小字体大小不起作用,如果字符串中有很多单词,字体大小不会改变。你也能解决这个问题吗?我希望整个文本适合 UILabel(活动标签),并调整字体大小以适合 UILabel。 编辑:我尝试在private func setupLabel() 中的userInteractionEnabled = true 上添加minimumScaleFactor = 1adjustsFontSizeToFitWidth = true,但没有任何效果。 @RoduckNickes :) 关于您的第二个问题,更新了分叉回购。从分叉的 repo 下载。使用minFontSize。存储库有很大的改进空间。任何机构都可以随意贡献。 太棒了!一个问题 - 如果 ActiveLabel 的创建者更新它会发生什么,我再次运行“pod install”。 verticalTextAlignementminFontSize会被删除吗? 我认为他们会被删除。我已将此问题链接分享给ActiveLabel 合作者,并向他们的存储库提出了拉取请求。他们可以合并我的提交,或者他们将重构代码以改进这些功能。我认为无论如何人们都会在下一个版本中获得这些功能。【参考方案2】:

看看这篇文章:

Programmatically Add CenterX/CenterY Constraints

问题出在你已经从 IB 中拖出一个标签,然后你试图改变它的位置。代码会中断。 您需要以编程方式制作标签,然后将其设置为中心。

非常认真地,@Alex 是正确的。 AutoLayout 解决了很多问题。

【讨论】:

【参考方案3】:

您可以像这样在代码中设置 textAlignment: showLab.textAlignment = NSTextAlignmentCenter;

或者您也可以使用 Storyboard 或 xib 来查看实验室中发生的情况,StoryBoard,当您查看时,我选择了对齐的第二个,这意味着标签中的中间

【讨论】:

以上是关于UILabel 垂直对齐的主要内容,如果未能解决你的问题,请参考以下文章

在 UILabel 中将文本垂直对齐到顶部

UILabel 垂直对齐

UILabel 垂直对齐缺少的空间

让UILabel的文字顶部对齐

如何将 UIButton 文本与 UILabel 文本垂直对齐?

让UILabel的文字顶部对齐