gpt4 book ai didi

ios - NSString sizeWithFont :constrainedToSize: computing wrong height

转载 作者:行者123 更新时间:2023-11-29 04:02:54 24 4
gpt4 key购买 nike

我有一个字幕样式 UITableViewCell,其高度根据每个字段的文本长度动态变化。问题是,如果标签有多行,textLabel 的高度(CGSize 大小)不会增加。

http://s10.postimg.org/6urher7s9/text_Label.png

奇怪的是,detailTextLabel 的高度按其应有的方式增加(CGSize size2)。计算两个高度的代码是相同的。

http://s21.postimg.org/m0af4gyw7/detail.png

这是我的功能:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
SETLISTFMNS0Song *song = [[[selectedSetlist.sets objectAtIndex:indexPath.section] songs]objectAtIndex:indexPath.row];
CGSize size = [song.name sizeWithFont:[UIFont fontWithName:setlistFont size:labelFontSize] constrainedToSize:CGSizeMake(self.setsTable.bounds.size.width, CGFLOAT_MAX)];
NSLog(@"Label: \"%@\" \tLabel Size: %f W %f H", song.name, size.width, size.height);

NSMutableString *detail;
if ([song cover]) {
detail = [[NSMutableString alloc] initWithFormat:@"(%@ cover)", [[song cover] name]];
}
if ([song with]) {
if (!detail) {
detail = [[NSMutableString alloc] initWithFormat:@"(with %@)", [[song with] name]];
}
else {
[detail appendFormat:@" (with %@)", [[song with] name]];
}
}
if ([song info]) {
if (!detail) {
detail = [[NSMutableString alloc] initWithFormat:@"(%@)", [song info]];
}
else {
[detail appendFormat:@" (%@)", [song info]];
}
}

if (detail.length != 0) {
CGSize size2 = [detail sizeWithFont:[UIFont fontWithName:setlistFont size:detailFontSize] constrainedToSize:CGSizeMake(self.setsTable.bounds.size.width, CGFLOAT_MAX)];
size.height += size2.height;
NSLog(@"Detail Label: \"%@\" \tDetail Label Size: %f W %f H", detail, size2.width, size2.height);
}

return size.height + 5;
}

我还在 cellForRowAtIndexPath 中将 textLabel 的 numberOfLines 属性设置为 0 以支持多行:

cell.textLabel.numberOfLines = 0;
cell.detailTextLabel.numberOfLines = 0;

更新:感谢@josh,我现在明白为什么会发生这种情况。我将宽度约束设置为 UITableView 的宽度,这太宽了。有人知道如何在创建 UILabel 之前找到它的宽度吗?哈!

谢谢!

最佳答案

您计算大小所依据的字符串有多长?我问是因为您的 sizeWithFont:constrainedToSize: 函数限制为单元格的完整宽度,但您的标签可能不是单元格的完整宽度。

我怀疑正在发生的事情是 song.info 足够短,如果该行是单元格的整个宽度,那么它可以放在一行上,并且您的歌曲 detail 足够长,可以计算出正确的行数,但又不能长到超过计算出的高度。

综上所述,我认为您需要做的是找出 textLabeldetailTextLabel 的宽度,并将约束设置为这些值。

更新 - 计算标签宽度的方法

由于单元格内标签的宽度取决于单元格的宽度,并且由于在调用 heightForRowAtIndexPath: 时未创建单元格,因此我们需要提出在设置宽度之前了解标签宽度的方法。做到这一点的唯一方法是我们自己设置宽度。我会这样做:

MyCell.h

#import <UIKit/UIKit.h>

@interface MyCell : UITableViewCell

+ (CGFloat)textLabelWidthForCellOfWidth:(CGFloat)cellWidth;

@end

MyCell.m

#import "MyCell.h"

@implementation MyCell

- (void)layoutSubviews {
[super layoutSubviews];

CGRect frame = self.textLabel.frame;
frame.size.width = [MyCell textLabelWidthForCellOfWidth:self.frame.size.width];
self.textLabel.frame = frame;
}

+ (CGFloat)textLabelWidthForCellOfWidth:(CGFloat)cellWidth {
// This calculation can be as complex as necessary to account for all elements that affect the label
return cellWidth - 20;
}

@end

然后在您的 heightForRowAtIndexPath: 实现中,您可以调用相同的类方法:

CGFloat labelWidth = [MyCell textLabelWidthForCellOfWidth:self.tableView.frame.size.width]; // Since non-grouped cells are the full width of the tableView
CGSize size2 = [detail sizeWithFont:[UIFont fontWithName:setlistFont size:detailFontSize] constrainedToSize:CGSizeMake(labelWidth, CGFLOAT_MAX)];

您将为需要引用的每个标签创建一个单独的类方法 (+)。

关于ios - NSString sizeWithFont :constrainedToSize: computing wrong height,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15654754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com