UILabel 垂直对齐
Posted
技术标签:
【中文标题】UILabel 垂直对齐【英文标题】:UILabel vertical alignment 【发布时间】:2015-12-16 01:14:25 【问题描述】:在我的应用程序中,我使用的是ActiveLabel
fram 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 = 1
和adjustsFontSizeToFitWidth = true
,但没有任何效果。
@RoduckNickes :) 关于您的第二个问题,更新了分叉回购。从分叉的 repo 下载。使用minFontSize
。存储库有很大的改进空间。任何机构都可以随意贡献。
太棒了!一个问题 - 如果 ActiveLabel 的创建者更新它会发生什么,我再次运行“pod install”。 verticalTextAlignement
和minFontSize
会被删除吗?
我认为他们会被删除。我已将此问题链接分享给ActiveLabel
合作者,并向他们的存储库提出了拉取请求。他们可以合并我的提交,或者他们将重构代码以改进这些功能。我认为无论如何人们都会在下一个版本中获得这些功能。【参考方案2】:
看看这篇文章:
Programmatically Add CenterX/CenterY Constraints
问题出在你已经从 IB 中拖出一个标签,然后你试图改变它的位置。代码会中断。 您需要以编程方式制作标签,然后将其设置为中心。
非常认真地,@Alex 是正确的。 AutoLayout 解决了很多问题。
【讨论】:
【参考方案3】:您可以像这样在代码中设置 textAlignment: showLab.textAlignment = NSTextAlignmentCenter;
或者您也可以使用 Storyboard 或 xib 来查看实验室中发生的情况,StoryBoard,当您查看时,我选择了对齐的第二个,这意味着标签中的中间
【讨论】:
以上是关于UILabel 垂直对齐的主要内容,如果未能解决你的问题,请参考以下文章