gpt4 book ai didi

iphone - 自动调整 UITableViewCell 中 UILabels 的大小

转载 作者:行者123 更新时间:2023-12-03 19:42:14 25 4
gpt4 key购买 nike

我将自己的 UILabel 添加到 UITableViewCellcontentView 中,因为我需要比默认 UITableViewCellStyles 提供的更多的布局控制。本质上,我希望detailLabel优先于textLabel,以便textLabel被截断。

我的 UITableViewController 中有以下代码:

- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString * const kCellIdentifier = @"CustomCell";

UITableViewCell * cell =
[tableView dequeueReusableCellWithIdentifier:kCellIdentifier];

UILabel * titleLabel, * dateLabel;

if(cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:kCellIdentifier] autorelease];

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

titleLabel = [[[UILabel alloc] init] autorelease];
titleLabel.tag = kTitleLabelTag;
titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth;

dateLabel = [[[UILabel alloc] init] autorelease];
dateLabel.tag = kDateLabelTag;
dateLabel.textColor = [UIColor blueColor];
dateLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;

[cell.contentView addSubview:titleLabel];
[cell.contentView addSubview:dateLabel];
}

[self configureCell:cell atIndexPath:indexPath];
return cell;
}

- (void)configureCell:(UITableViewCell *)pCell
atIndexPath:(NSIndexPath *)pIndexPath
{
const float kHeight = 44.0, kLeftIndent = 8.0, kOverallWidth = 293.0,
kGap = 1.0;

UILabel * titleLabel, * dateLabel;
titleLabel = (UILabel *)[pCell.contentView viewWithTag:kTitleLabelTag];
dateLabel = (UILabel *)[pCell.contentView viewWithTag:kDateLabelTag];

NSString * dateText = @"9:39 AM";

// Calculate the size of dateLabel
CGSize dateSize = [dateText sizeWithFont:[dateLabel font]
constrainedToSize:CGSizeMake(kOverallWidth, kHeight)];

const float dateXPos = kOverallWidth - dateSize.width;
dateLabel.frame = CGRectMake(dateXPos, 0.0, dateSize.width, kHeight);
titleLabel.frame = CGRectMake(kLeftIndent, 0.0,
dateXPos - kLeftIndent - kGap, kHeight);

titleLabel.text = @"Some potentially very long text which will be wrapped.";
dateLabel.text = dateText;
pCell.contentView.backgroundColor = [UIColor purpleColor];
}

上面的代码产生不正确的结果。当表格 View 最初显示时,它看起来像 this image of the renderings 中的图 1)。 .

因此,所有 dateLabel 的右侧都有一个不需要的间隙。 (紫色背景只是为了更好地了解正在发生的情况)

当像图像中的 2) 那样向上拖动 tableview 时,它会弹回来并看起来像 3)。

第一行现在正是我想要的布局,并且在 configureCell:atIndexPath: 中计算。我猜想发生这种行为是因为单元被重新使用然后再次配置。

所以感觉我缺少某种初始化,我尝试调用 pCellpCell 的 setNeedsLayoutlayoutSubviews .contentView 但从未实现初始正确渲染。

仅当我将 titleLabeldateLabelautoresizingMask 设置为 UIViewAutoresizingNone 时,我才能获得正确的初始渲染,然而,滑动删除不起作用,因为删除按钮是在 dateLabel 上呈现的。

我必须在代码中更改哪些内容,以便所有单元格都像第三张图片中的第一个单元格一样最初渲染

谢谢!

PS:我想内嵌这些图片,但不幸的是我对此没有足够的声誉。

最佳答案

一个好的、也许更简单的方法是:

首先创建一个自定义 UITableViewCell 子类,您可以使用 Interface Builder 进行设置。如果“MyTableViewCell”是您的自定义单元格 View ,您可以在 CellForRowAtIndexPath 中初始化它,如下所示:

MyTableViewCellClass *cell = (MyTableViewCellClass *)[tableView dequeueReusableCellWithIdentifier:@"MyTableViewCellClass"] autorelease];

if (!cell)
cell = [[[MyTableViewCellClass alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyTableViewCellClass"] autorelease];

// Call specific methods on your cell to pass information to it, not for display
[cell setProperties:...];

然后在您的自定义 UITableViewCell 子类中实现layoutSubviews 方法。例如:

-(void) layoutSubviews
{
// You must call this first to make sure your cell gets current parent information
[super layoutSubviews];

// Retrieve the content view bounds. This will include the edit symbols when present (delete button and ordering symbol
float inset = 5.0;
CGRect bounds = [[self contentView] bounds];

// Keep on going here with your own view layout.

}

这样做基本上可以将单元格模型 (CellForRowAtIndexPath) 与单元格 View (单元格绘图的自定义实现)分开。如果您稍后更改单元格的实现(布局),只需更改单元格布局即可轻松完成此操作,而无需担心 CellForRowAtIndexPath 方法。

关于iphone - 自动调整 UITableViewCell 中 UILabels 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5092596/

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