设置 UILabel 对齐顶部在单元格中不起作用

Posted

技术标签:

【中文标题】设置 UILabel 对齐顶部在单元格中不起作用【英文标题】:Set UILabel Align top is not working in the cell 【发布时间】:2013-12-12 15:02:01 【问题描述】:

在表格单元格内实现文本垂直对齐时遇到问题。

我想要做的是基于文本的长度,我想在单元格内的第一侧 UILabel 中显示一条顶部对齐的消息。

例如,如果消息只有一行 文本应顶部对齐:

如果有两行,那么它应该是这样的:

一开始我能看到的是这样的

所以我搜索了网络,我发现 使用

[label1 sizeToFit];

但问题在于表格视图单元格中,它不一定总是被调用,尤其是当我切换到另一个选项卡视图时。

然后我尝试通过代码动态生成标签,但问题是更不用说设置我想要的字体格式的复杂过程。我必须管理标签是否已插入,然后在每次调用 cellForRowAtIndexpath 时重用它。

更奇怪的是,一旦我选择了行。对齐方式从您在第一张图片中看到的切换到第三张。当我切换到不同的选项卡视图并切换回视图时也会发生这种情况。

我想知道是否有人遇到过这样的问题并有解决问题的方法。

感谢您提前回复。

编辑:

@βḧäṙℊặṿῗ,你说的我都试过了。如果只有一行,它会成功对齐标签文本。我的情况是这样,因为我有多个标签视图。一旦我在选项卡视图之间来回切换。对齐刚刚恢复到中心垂直对齐。当我选择行时也会发生这种情况。有什么想法吗?

【问题讨论】:

你设置 YOUR_LABLE_OBJ.numberOfLines = 0; ? 【参考方案1】:

试试这个

// label will use the number of lines as per content
[myLabel setNumberOfLines:0]; // VERY IMP 
[myLabel sizeToFit];

编辑:

由于您有一个最多显示两行的额外条件,因此您需要将 setNumberOfLines: 设置为 2

[myLabel setNumberOfLines:2];

【讨论】:

@AashishJoshi 是的。另请阅读numberOfLine 和sizeToFit 我经过测试@βḧäṙℊặṿῗ 的答案运行完美,你可以使用它。 是的,我已将其设置为 0。但是在视图之间切换时,标签的显示不一致。我就是想知道iphone的原生消息app是怎么实现的。 我有一个额外的条件是我最多只显示两行。我需要与 Iphone 的本机消息应用程序完全相同的行为。 @βḧäṙℊặṿῗ,你说的我都试过了。如果只有一行,它会成功对齐标签文本。我的情况是这样,因为我有多个标签视图。一旦我在选项卡视图之间来回切换。对齐刚刚恢复到中心垂直对齐。当我选择行时也会发生这种情况。有什么想法吗?【参考方案2】:

创建UILabel+Extras 并将以下方法添加到此类。

- (void)alignTop
    CGSize fontSize = [self.text sizeWithAttributes:@NSFontAttributeName:self.font];
    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.size.width;    //expected width of label
    CGRect rect = [self.text boundingRectWithSize:CGSizeMake(finalWidth, finalHeight) options:NSStringDrawingTruncatesLastVisibleLine attributes:@NSFontAttributeName:self.font context:nil];
    CGSize theStringSize = rect.size;
    int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;
    for(int i=0; i< newLinesToPad; i++)
        self.text = [self.text stringByAppendingString:@" \n"];

像这样调用这个方法..

[YOUR_LABEL alignTop];

【讨论】:

哦是的,就是这样!【参考方案3】:

要么你设置行数为 0 像

 [yourLabelObject setNumberOfLines:0];
 [yourLabelObject sizeToFit];

或者

您可以在运行时根据 textString 长度找到标签的高度。 以下方法将为您返回文本字符串长度的标签大小(高度和宽度)。 这里宽度是固定的,只有高度会改变:

-  (CGSize) calculateLabelHeightWith:(CGFloat)width text:(NSString*)textString andFont:(UIFont *)txtFont

    CGSize maximumSize = CGSizeMake(width, 9999);
    CGSize size = [textString sizeWithFont:txtFont
                         constrainedToSize:maximumSize
                             lineBreakMode:UILineBreakModeWordWrap];
    return size;

你每次设置文本和设置标签的框架时,你需要计算标签的框架

希望对你有帮助。

【讨论】:

【参考方案4】:

可能听起来有点傻,但这是我的方法:对于任何需要顶部对齐的字段,我用多个“\n”填充文本。这会导致文本自动顶部对齐。和上面Mehul的方法差不多。

http://i.stack.imgur.com/8u5q4.png

【讨论】:

以上是关于设置 UILabel 对齐顶部在单元格中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 UILabel 中覆盖“文本”在 iOS 6 中不起作用

UIlabel尾随空格不起作用

UIButton 在 collectionView 单元格中不起作用

图像的滚动视图在自定义表格视图单元格中不起作用

为啥两个表格视图单元格中的两个集合视图在 Swift 4 中不起作用?

表格单元格中的 CSS 绝对定位在 Firefox 中不起作用