垂直alignmentUILabel中的文本(注意:使用AutoLayout)
我正在复制问题之前问的同一个问题 。 我尝试了所给出的解决scheme,但无法解决,因为在使用Autolayout时,sizetofit无效。
预期的显示如下所示。
编辑
在我最初的答案中,我使用了标签的段落风格。 事实certificate,对于多行标签,这实际上防止了标签的多行。 结果我把它从计算中删除了。 在Github中查看更多关于这个的信息
对于那些使用开放源代码的用户来说,更加适合使用TTTAttributedLabel ,你可以将标签的文本alignment方式设置为TTTAttributedLabelVerticalAlignmentTop
诀窍是drawTextInRect
UILabel
并覆盖drawTextInRect
。 然后强制将文本绘制在标签边界的原点处。
这是一个你可以立即使用的天真的实现:
迅速
@IBDesignable class TopAlignedLabel: UILabel { override func drawTextInRect(rect: CGRect) { if let stringText = text { let stringTextAsNSString = stringText as NSString var labelStringSize = stringTextAsNSString.boundingRectWithSize(CGSizeMake(CGRectGetWidth(self.frame), CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil).size super.drawTextInRect(CGRectMake(0, 0, CGRectGetWidth(self.frame), ceil(labelStringSize.height))) } else { super.drawTextInRect(rect) } } override func prepareForInterfaceBuilder() { super.prepareForInterfaceBuilder() layer.borderWidth = 1 layer.borderColor = UIColor.blackColor().CGColor } }
Swift 3
@IBDesignable class TopAlignedLabel: UILabel { override func drawText(in rect: CGRect) { if let stringText = text { let stringTextAsNSString = stringText as NSString let labelStringSize = stringTextAsNSString.boundingRect(with: CGSize(width: self.frame.width,height: CGFloat.greatestFiniteMagnitude), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil).size super.drawText(in: CGRect(x:0,y: 0,width: self.frame.width, height:ceil(labelStringSize.height))) } else { super.drawText(in: rect) } } override func prepareForInterfaceBuilder() { super.prepareForInterfaceBuilder() layer.borderWidth = 1 layer.borderColor = UIColor.black.cgColor } }
Objective-C的
IB_DESIGNABLE @interface TopAlignedLabel : UILabel @end @implementation TopAlignedLabel - (void)drawTextInRect:(CGRect)rect { if (self.text) { CGSize labelStringSize = [self.text boundingRectWithSize:CGSizeMake(CGRectGetWidth(self.frame), CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:self.font} context:nil].size; [super drawTextInRect:CGRectMake(0, 0, ceilf(CGRectGetWidth(self.frame)),ceilf(labelStringSize.height))]; } else { [super drawTextInRect:rect]; } } - (void)prepareForInterfaceBuilder { [super prepareForInterfaceBuilder]; self.layer.borderWidth = 1; self.layer.borderColor = [UIColor blackColor].CGColor; } @end
由于我使用了IBDesignable,所以你可以将这个标签添加到故事板并观看,这就是我看起来的样子
如果您不限制使用固定大小的UILabel,而不是使用 UILabel中的文本alignment, 只需使用给定标签上的≥约束来更改它的大小。
这是使用自动布局的最优雅的解决scheme。 不要忘记将numberOfLines设置为零。 可以在这里findisaced的原始答案。
您可以使用UITextView而不是UILabel:
取消选中“滚动已启用”
取消选中“可编辑”
取消选中“可选”
将背景颜色设置为ClearColor
相反,我把底层空间常量改为@ 250的优先级,解决了我的问题。 而我的标签有高度常数<=常数
你可以通过移除最小高度来达到这个目的。
如果你需要在标签下面的其他东西的最小高度,那么你会使用一个容器视图,根据标签内容resize,但使用最小。
我有同样的问题,这就是我解决它的方法。 我刚刚在标签的Attribute Inspector下编辑了Baseline。 将其设置为“alignment中心”。
你可以试试button[button setContentVerticalAlignment:UIControlContentVerticalAlignmentTop];
编辑:
如果你只想使用标签,你可以试试这个:
自动布局仅适用于控制器的边缘/大小,不适用于控制器内容。因此,使用自动布局在第一行顶部显示标签文本不是一个好主意。 根据我sizetofit是这样做的最佳select。
我使用了@Daniel Golasko的解决scheme,每当UILabel中的文本长于UILabel可以包含的文本时,文本将开始向下移动,而不是保持alignment到顶部。
我改变了这一行,以确保文本正确alignment
[super drawTextInRect:CGRectMake(0, 0, ceilf(CGRectGetWidth(self.frame)),MIN(ceilf(labelStringSize.height), self.frame.size.height))];
我有一个类似的问题,有3个标签。 中间的标签可能比其他两个文本长得多,所以它的高度可能会变得更大。
喜欢这个:
我将中间标签的底部空间约束设置为> =底部标签。
这解决了我的问题。
对于我来说,我没有设置高度限制,文本总是从标签的顶部增长。 这个标签的限制是上,左,右。 顺便说一句,我的标签有固定的行号,所以不用担心高度。
@IBInspectable var alignTop: Bool = false func setAlignTop() { let text = self.text! let lines = text.characters.split(separator: "\n").count if lines < self.numberOfLines { var newLines = "" for _ in 0..<(self.numberOfLines - lines) { newLines = newLines.appending("\n ") } self.text! = text.appending(newLines) } } override var text: String? { didSet { if alignTop { self.setAlignTop() } } }
以下是Daniel Galasko对Swift 3解决scheme的改进(在这里您还可以设置最大行数而不会在顶部有偏移量):
import UIKit @IBDesignable class TopAlignedLabel: UILabel { override func drawText(in rect: CGRect) { if let stringText = text { let stringTextAsNSString = stringText as NSString let labelString = stringTextAsNSString.boundingRect(with: CGSize(width: frame.width, height: .greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil) super.drawText(in: CGRect(x: 0, y: 0, width: frame.width, height: ceil(labelString.size.height) > frame.height ? frame.height : ceil(labelString.size.height))) } else { super.drawText(in: rect) } } override func prepareForInterfaceBuilder() { super.prepareForInterfaceBuilder() layer.borderWidth = 1 layer.borderColor = UIColor.black.cgColor } }
对于标签高度不需要保持不变的情况,有一个简单的解决scheme:将Label
放在Stack View
。 确保将前导和尾随常数添加到Stack View
。 以下是如何在故事板中执行此操作的屏幕截图: