我想使用UITableView
创建应用的博客部分。该表应该有两个部分和一个分组的样式。第一部分是博客,表格的第二部分是评论。博客可以是任何规模。当输入大量文本时,我的意思是10K字或更多,带有链接或/和照片,应用程序崩溃或根本不显示文本。评论还可以包含大量文本以及链接和照片。似乎UITableView
有其局限性。这些是我面临的问题:
关于如何实现这一目标的任何想法?我应该尝试使用UITextViews
创建我自己的表来尝试模仿UITableView
的行为吗?是否有一种简单的方法可以使用Apple的UITableView
来实现它?我还没有看到有这样的应用程序。任何可以帮助我入门的代码?我还必须使用NSAttributedString
进行文本格式化。
更新
阅读tableView:heightForRowAtIndexPath:
的文档找到了一个重要的注释,它可以回答问题而不是我的问题。
重要提示:由于底层实施细节,您不应返回大于2009的值。
答案 0 :(得分:1)
您需要根据文本动态调整表格视图单元格高度。之后,您需要创建一个动态高度取决于文本的标签,并在单元格中添加该标签。
对于内存管理,您需要确保您的单元格是自动释放的,并且您在单元格中添加的子视图也会被重新启用。
这里有一些代码可以帮助您显示整个文本,而不必担心滚动。
假设blogArray是包含要在单元格中显示的文本的数组。(替换为您自己的文本)。
- (UITableViewCell *)tableView:(UITableView *)tbleView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
if([self.blogArray count]>0)
{
CGSize labelsize;
UILabel *blogTextLabel = [[UILabel alloc] init];;
[blogTextLabel setNumberOfLines:0];
[blogTextLabel setBackgroundColor:[UIColor clearColor]];
NSString *text=[self.blogArray objectAtIndex:indexPath.row];
[blogTextLabel setFont:[UIFont fontWithName:@"Helvetica"size:14]];
labelsize=[text sizeWithFont: blogTextLabel.font constrainedToSize:CGSizeMake(268, 2000.0) lineBreakMode:UILineBreakModeWordWrap];
blogTextLabel.frame=CGRectMake(10, 24, 268, labelsize.height);
blogTextLabel.text=text;
[cell.contentView addSubview: blogTextLabel];
[blogTextLabel release];
}
else {
}
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
return cell;
}
您还需要调整表格视图单元格高度: -
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CGSize labelsize;
UILabel * textDesc1 = [[UILabel alloc] init];
[textDesc1 setNumberOfLines:0];
textDesc1.text=[self.blogArray objectAtIndex:indexPath.row];
[textDesc1 setFont:[UIFont fontWithName:@"Helvetica" size:14.0]];
labelsize=[textDesc1.text sizeWithFont:textDesc1.font constrainedToSize:CGSizeMake(268, 2000.0) lineBreakMode:UILineBreakModeWordWrap];
labelsize.height=labelsize.height+35;
[textDesc1 release];
return (CGFloat)labelsize.height;
}
答案 1 :(得分:0)
确保cellForRowAtIndexPath:
数据源方法中reusing cells为{{3}}。这应该确保滚动不会滞后。如果它继续滞后,请确保在绘制单元格时不会阻塞主线程。此外,您可以在UILabel中使用adjustsFontSizeToFitWidth
和lineBreakMode
等属性来控制在任何给定时间显示的文本数量。
确保您自动释放alloc
cellForRowAtIndexPath:
中{{1}}的所有单元格。