这个问题有2个规定。它不能通过a)
解决QPaintEvent
或b)
- (void)viewDidAppear:(BOOL)animated {
...
[self.tableView reloadData]
}
a)当调用viewDidAppear时,A不起作用,因为单元格的数据不存在。数据是从后台线程中的服务器异步获取的,需要一些时间来检索。此外,此调用的完成块中的- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...
[cell layoutIfNeeded];
}
也不起作用。 (是的,reloadData语句正在执行它并在主线程上执行)
b)永远不需要从cellForRowAtIndexPath调用它,这是一个更大问题的警告信号。虽然调用[self.tableView reloadData]
正在解决宽度问题,但它的成本很高。每次通话6-10ms。 cellForRowAtIndexPath必须保持在13.67ms(1 / 60fps)以下,否则你会遇到性能问题。此调用导致了大量性能问题,也不是正确的解决方案。
现在,关于这个问题:
1)正如你在我的笔尖中看到的那样[http://i.imgur.com/oa8xZvB.png],我的Cell和ContentView的宽度都是321。
2)我有以下代码cellForRowAtIndexPath
[cell layoutIfNeeded]
3)初始加载后,这些是结果/输出完全向下滚动并再次回升3次。
NSLog(@"TableView Width: %f", self.tableView.frame.size.width);
NSLog(@" ContentView Width: %f", cell.contentView.frame.size.width);
NSLog(@" ContainerView Width: %f", cell.containerView.frame.size.width);
NSLog(@" CardView Width: %f", cell.cardView.frame.size.width);
此代码输出的前5组看起来像这样......
2015-04-28 11:24:10.026 Roto Forum[82016:683164] TableView Width: 375.000000
2015-04-28 11:24:10.026 Roto Forum[82016:683164] ContentView Width: 321.000000
2015-04-28 11:24:10.027 Roto Forum[82016:683164] ContainerView Width: 345.000000
2015-04-28 11:24:10.027 Roto Forum[82016:683164] CardView Width: 305.000000
...
... 3 more sets exactly like these removed for brevity ...
...
2015-04-28 11:24:12.867 Roto Forum[82016:683164] ContentView Width: 321.000000
2015-04-28 11:24:12.867 Roto Forum[82016:683164] ContainerView Width: 345.000000
2015-04-28 11:24:12.867 Roto Forum[82016:683164] CardView Width: 305.000000
2015-04-28 11:24:12.901 Roto Forum[82016:683164] TableView Width: 375.000000
2015-04-28 11:24:12.901 Roto Forum[82016:683164] ContentView Width: 375.000000
2015-04-28 11:24:12.901 Roto Forum[82016:683164] ContainerView Width: 383.000000
2015-04-28 11:24:12.901 Roto Forum[82016:683164] CardView Width: 343.000000
...
... 37 more sets exactly like these removed for brevity ...
...
2015-04-28 11:24:20.716 Roto Forum[82016:683164] TableView Width: 375.000000
2015-04-28 11:24:20.716 Roto Forum[82016:683164] ContentView Width: 375.000000
2015-04-28 11:24:20.716 Roto Forum[82016:683164] ContainerView Width: 383.000000
2015-04-28 11:24:20.716 Roto Forum[82016:683164] CardView Width: 343.000000
最后40个看起来像这样......
2015-04-28 11:24:10.026 Roto Forum[82016:683164] TableView Width: 375.000000
2015-04-28 11:24:10.026 Roto Forum[82016:683164] ContentView Width: 321.000000
2015-04-28 11:24:10.027 Roto Forum[82016:683164] ContainerView Width: 345.000000
2015-04-28 11:24:10.027 Roto Forum[82016:683164] CardView Width: 305.000000
最初加载的单元格的ContentView / ContainerView / CardView宽度值为321/345/305,而随后加载的任何其他单元格的宽度值为375/383/343。是什么给了什么?
这些是最初加载的,因为它们可以从get go中的表视图中查看。最后40是我每次在桌面视图中上下滚动时得到的。为什么我在初始加载时得到这些不正确的宽度?
===========================编辑:=============== ============
根据第一条评论中的要求添加一些代码
heightForRowAtIndexPath:未实现,因为这是iOS8 Self Sizing Cell。
的cellForRowAtIndexPath:
2015-04-28 11:24:20.716 Roto Forum[82016:683164] TableView Width: 375.000000
2015-04-28 11:24:20.716 Roto Forum[82016:683164] ContentView Width: 375.000000
2015-04-28 11:24:20.716 Roto Forum[82016:683164] ContainerView Width: 383.000000
2015-04-28 11:24:20.716 Roto Forum[82016:683164] CardView Width: 343.000000
ViewController.h
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"MyCardCell";
MyCardCellTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
Question *question = [self.questions objectAtIndex:indexPath.row];
cell.title.text = question.questionTitle;
cell.subtitle.text = question.questionText;
cell.username.text = question.userName;
NSLog(@"TableView Width: %f", self.tableView.frame.size.width);
NSLog(@" ContentView Width: %f", cell.contentView.frame.size.width);
NSLog(@" ContainerView Width: %f", cell.containerView.frame.size.width);
NSLog(@" CardView Width: %f", cell.cardView.frame.size.width);
return cell;
}
ViewController.m
viewDidLoad中:
@property UINib *myCardCellNib;
表格查看单元格初始化:
self.myCardCellNib = [UINib nibWithNibName:@"MyCardCellTableViewCell" bundle:nil];
[self.tableView registerNib:self.myCardCellNib forCellReuseIdentifier:@"MyCardCell"];
[self.tableView setEstimatedRowHeight:237.0];
[self.tableView setRowHeight:UITableViewAutomaticDimension];
答案 0 :(得分:1)
解决。
问题是我的自定义单元类上的initializeFonts调用。更改字体大小会更改单元格的高度。