为什么我的自定义UITableViewCell宽度在初始加载时不正确?

时间:2015-04-28 18:41:07

标签: ios uitableview cocoa-touch autolayout

这个问题有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];

1 个答案:

答案 0 :(得分:1)

解决。

问题是我的自定义单元类上的initializeFonts调用。更改字体大小会更改单元格的高度。