objective-c – iOS – 在滚动期间不会触发heightForRowAtIndexP
发布时间:2020-12-16 07:27:13 所属栏目:百科 来源:网络整理
导读:我正在使用 Xcode4编写一个简单的iOS应用程序,它使用表格视图来显示故事列表(从URL获取).我将故事标题显示为UILabels,并作为表格单元格的子视图. 我正在超越heightForRowAtIndexPath,根据每个故事标题的长度来计算单元格的正确高度.我正在将标签添加到cellFo
我正在使用
Xcode4编写一个简单的iOS应用程序,它使用表格视图来显示故事列表(从URL获取).我将故事标题显示为UILabels,并作为表格单元格的子视图.
我正在超越heightForRowAtIndexPath,根据每个故事标题的长度来计算单元格的正确高度.我正在将标签添加到cellForRowAtIndexPath中的单元格中.当我在模拟器中运行应用程序时,一切都很好.但是:当我向下滚动并向上滚动时,标签会搞砸.它们被截断并超载.我调试了一下,发现在滚动过程中不会触发heightForRowAtIndexPath方法,因此不会重新计算单元格高度,因此标签文本会溢出,并且会变得难看.这是相关代码: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; [cell autorelease]; } /* NOTE: code to load trimmedTitle dynamically is snipped */ NSString* trimmedTitle; UIFont *cellFont = [UIFont fontWithName:@"Georgia" size:14.0]; CGSize constraintSize = CGSizeMake(280.0f,MAXFLOAT); CGSize labelSize = [trimmedTitle sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; UILabel* tempLabel = [[UILabel alloc] initWithFrame:CGRectMake(60,230,labelSize.height)]; tempLabel.lineBreakMode = UILineBreakModeWordWrap; tempLabel.text = trimmedTitle; tempLabel.numberOfLines = 0; [cell.contentView addSubview:tempLabel]; [tempLabel release]; return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSString* cellText; // code to load cellText dynamically is snipped off UIFont *cellFont = [UIFont fontWithName:@"Georgia" size:14.0]; CGSize constraintSize = CGSizeMake(230.0f,MAXFLOAT); CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; return labelSize.height + 20; } 解决方法
在这些情况下,我通常预先计算所有行的高度,将它们存储在数组中,然后只返回heightForRowAtIndexPath中的那些高度.这样,tableview知道每个单元格的高度,并且即使在重用之后单元格也符合该高度.我不知道一种强制计算单元格高度的方法,除了查找单元格何时可见并重新加载它,这看起来太昂贵了.
更新:一些示例代码: 我有一个名为 – (void)calculateHeights的方法,它执行与heightForRowAtIndexPath相同的计算,但将结果存储在我的可变数组heights_ivar中: - (void)calculateHeights { [heights_ removeAllObjects] for (Widget *myWidget in modelWidgetArray) { NSString* cellText; // code to load cellText dynamically is snipped off UIFont *cellFont = [UIFont fontWithName:@"Georgia" size:14.0]; CGSize constraintSize = CGSizeMake(230.0f,MAXFLOAT); CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; [heights_ addObject:[NSNumber numberWithFloat:labelSize.height + 20.0f]]; } } 然后在heightForRowAtIndexPath中,给出一个1节的表视图: - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return [heights_ objectAtIndex:[indexPath row]]; } 如果您的表视图有多个部分,您需要进行一些数学运算才能转换为一维高度数组并再次返回.此外,任何时候你-reloadData你也需要-calculateHeights. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |