调整自定义UITableView单元格高度和该单元格中UITextView的高度(存在其他UI元素)



我有一个自定义表单元格,其中包含3个标签、一个按钮和一个UITextView。

UITextView的文本只有在运行时才知道,因为它是我从服务器中提取的数据。

我正在尝试根据放入UITextView的文本将UITextView和自定义表格单元格的大小调整到正确的高度。

UITextView的文本在-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath方法中设置。

在这里,我试图使用以下内容来调整UITextView(bodyTextView)的大小。。

CGSize stringSize = [cell.bodyTextView.text sizeWithFont:cell.bodyTextView.font constrainedToSize:CGSizeMake(cell.bodyTextView.bounds.size.width, 9999) lineBreakMode:NSLineBreakByWordWrapping];
[cell.bodyTextView setText:threadMessage.body];
CGRect bodyFrame = cell.bodyTextView.frame;
bodyFrame.size = cell.bodyTextView.contentSize;
[cell.bodyTextView setFrame:bodyFrame];

这似乎或多或少都很好,或者我的UIButton没有向下移动到它应该移动的位置,即使它在UITextView的底部有一个"Top Space to"约束。我本以为它会自动移动。不过我可以用程序把它移到合适的位置,所以没什么大不了的。

下一段代码确实将tableViewCell调整到适合标签和UITextView的高度,但底部的按钮没有足够的空间。接下来,我计算单元格的高度,并使用以下公式返回。。。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *)indexPath
{
CGSize stringSize = [threadMessage.body sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(280, 9999) lineBreakMode:NSLineBreakByWordWrapping];
float oldHeight = 28;
float newHeight = stringSize.height;
return tableView.rowHeight - oldHeight + newHeight;
}

正如你所看到的,我正在做UITextView高度和新高度之间的差异。我试图用程序获得旧高度,但我得到了成千上万的疯狂值。

最大的问题是,当视图第一次显示时,行的大小或多或少都是正确的。但是UITextView没有大小。如果我滚动以将其移出屏幕,然后再将其向后滚动,则UITextView的大小正确。但是,如果我在屏幕上来回滚动,它会再次调整大小为一行。

我觉得我有鸡或蛋的事情在发生,我无法理解。

我希望弄清楚的两个主要问题是:

1)如何让UITextView从一开始就正确调整大小,并保持这种大小,而不管屏幕上下滚动?

2)如何使我的自定义TableCellView的大小适当,以包括按钮的高度?

我希望这一切都有意义,我已经提供了足够的细节。有任何问题请告诉我。

如有任何建议,我们将不胜感激。非常感谢。

问候,

Peter

好的,我终于解决了问题。我想我会发布我的解决方案,以防其他人遇到这个问题,因为今天这让我的大脑扭曲了好几个小时。

我认为这个问题可能与我使用iOS 6 SDK的项目有关。我下载了iOS 5模拟器,并尝试在上面运行我的应用程序。它一开始我就犯了一个错误。NSLayoutInconsiencyException(或类似的情况)。经过一些在线搜索,我发现iOS 5与iOS 6的设置不兼容。

这个设置是"用户自动布局",它是在我的故事板文件中签入的。要找到它,请选择情节提要文件,然后选择右侧的"文件检查器"(Command-Options-1)。在界面生成器文档部分,您将看到"使用自动布局"复选框。取消选中此项,情况开始好转。我的UITextView不再每次在屏幕上和屏幕下滚动单元格时都被调整为一行并返回到全长。

然而,我仍然有一个问题,牢房的高度不太合适。既然我已经解决了自动布局问题,这就变得非常简单了(你不会相信我到处都是注释掉的试错测试代码:)。

在cellforRowAtIndexPath函数中,您需要将UITextView的文本设置为您想要的任何文本,然后简单地获取其内容大小,然后调整UITextView框架的大小。。。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCellIdentifier"];
[cell.bodyTextView setText:myText];
CGRect bodyFrame = cell.bodyTextView.frame;
bodyFrame.size = cell.bodyTextView.contentSize;
[cell.bodyTextView setFrame:bodyFrame];
... Whatever else you need to do here ...
}

然后在heightForRowAtIndexPath中,我发现再次获取单元格并设置文本,我能够获得正确的大小差,从而返回正确的大小。通过使用大小差异,它允许在表单元格中使用任何其他UI元素。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCellIdentifier"]; 
float oldHeight = cell.bodyTextView.frame.size.height;
cell.bodyTextView.text = threadMessage.body;
CGRect bodyFrame = cell.bodyTextView.frame;
bodyFrame.size = cell.bodyTextView.contentSize;
float newHeight = cell.bodyTextView.contentSize.height;
return tableView.rowHeight - oldHeight + newHeight;
}

我希望这对将来的某个人有所帮助。如果这些都没有意义,请随时问我任何问题。感谢Mohit帮助我。非常感谢。

Etep,试试这个。。。首先,你关闭了单元格和按钮的resize/orientation属性,然后,因为你能够根据到达的文本来确定文本视图的正确尺寸,所以在计算行高的地方,而不是使用获取文本大小,你需要什么来获得文本视图的适当高度。。。休息很好。(在"cellForRowAtIndexPath"中,您应该使用可重复使用的单元格,或者说将代码放入if(cell==nil){})

我在旋转时自动调整自定义单元格时也遇到了同样的问题。经过斗争,我得到了授权cell.contentView的解决方案,因为我正在将我的视图作为子视图添加到cell.contenview.中

我使用了以下代码,我的代码运行良好:)

cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;

最新更新