UILabel 垂直对齐
UILabel vertical alignment
在我的应用程序中,我使用 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
}
有什么想法可以像这样把它放在中间:
(图片取自Storyboard)
您可以像这样在代码中设置textAlignment:
showLab.textAlignment = NSTextAlignmentCenter;
或者您也可以使用 Storyboard 或 xib 来查看实验室中发生的情况,StoryBoard,如您所见,我选择对齐的第二个,这意味着在标签中居中
看看这个post:
Programmatically Add CenterX/CenterY Constraints
好吧,问题是当您已经从 IB 中拖出一个标签,然后您试图改变它的位置时。代码会中断。
您需要以编程方式制作标签,然后将其设置到中心。
说真的,@Alex 是正确的。 AutoLayout 解决了很多问题。
在 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,记得设置verticalTextAlignmentCenter
为true
在我的应用程序中,我使用 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
}
有什么想法可以像这样把它放在中间:
(图片取自Storyboard)
您可以像这样在代码中设置textAlignment: showLab.textAlignment = NSTextAlignmentCenter;
或者您也可以使用 Storyboard 或 xib 来查看实验室中发生的情况,StoryBoard,如您所见,我选择对齐的第二个,这意味着在标签中居中
看看这个post:
Programmatically Add CenterX/CenterY Constraints
好吧,问题是当您已经从 IB 中拖出一个标签,然后您试图改变它的位置时。代码会中断。 您需要以编程方式制作标签,然后将其设置到中心。
说真的,@Alex 是正确的。 AutoLayout 解决了很多问题。
在 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,记得设置verticalTextAlignmentCenter
为true