设置 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 中不起作用
UIButton 在 collectionView 单元格中不起作用