gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:23:21 40 4
gpt4 key购买 nike

这个问题有两个规定。它不能通过 a) 解决

- (void)viewDidAppear:(BOOL)animated { 
...
[self.tableView reloadData]
}

或b)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...
[cell layoutIfNeeded];
}

a) A 不起作用,因为调用 viewDidAppear 时单元格的数据不存在。数据在后台线程中从服务器异步获取,需要一些时间来检索。此外,此调用的完成 block 中的 [self.tableView reloadData] 也不起作用。 (是的,reloadData 语句正在执行它的工作并在主线程上执行)

b) 永远不需要从 cellForRowAtIndexPath 调用它,这是一个更大问题的警告信号。虽然调用 [cell layoutIfNeeded] 解决了宽度问题,但它的代价是巨大的。每次通话 6-10 毫秒。 cellForRowAtIndexPath 必须保持在 13.67ms (1/60fps) 以下,否则你会遇到性能问题。此调用会导致大量性能问题,也不是正确的解决方案。

现在,关于这个问题:

1) 正如你在我的 Nib 中看到的那样[ http://i.imgur.com/oa8xZvB.png] ,我的 Cell 和 ContentView 的宽度都是 321。

2) 我有以下代码 cellForRowAtIndexPath

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);

3) 初始加载后,这些结果/输出一直向下滚动并再次向上滚动 3 次。

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

此代码输出的前 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

最后 40 个看起来像这样......

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

最初加载的单元格的 ContentView/ContainerView/CardView 宽度值为 321/345/305,而所有后续加载该单元格或任何其他单元格的宽度值为 375/383/343。给了什么?

这些是最初加载的,因为它们从一开始就可以在表格 View 中查看。最后 40 是我每次上下滚动表格 View 时得到的。为什么我在初始加载时得到这些不正确的宽度?

=========================== 编辑:=============== ============

根据第一条评论的要求添加一些代码

heightForRowAtIndexPath:未实现,因为这是一个 iOS8 自调整单元格。

cellForRowAtIndexPath:

- (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.h

@property UINib *myCardCellNib;

ViewController.m

viewDidLoad:

self.myCardCellNib = [UINib nibWithNibName:@"MyCardCellTableViewCell" bundle:nil];
[self.tableView registerNib:self.myCardCellNib forCellReuseIdentifier:@"MyCardCell"];
[self.tableView setEstimatedRowHeight:237.0];
[self.tableView setRowHeight:UITableViewAutomaticDimension];

表格 View 单元初始化:

#import "MyCardCellTableViewCell.h"

//managers
#import "FFFColorManager.h"

@implementation MyCardCellTableViewCell

- (void)awakeFromNib {
[self initializeAppearance];
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
}

#pragma mark - Private

- (void)initializeAppearance {
[self initializeFonts];
[self initializeColors];
}

- (void)initializeFonts {
self.title.font = [UIFont fontWithName:@"Roboto-Regular" size:14.0];
self.subtitle.font = [UIFont fontWithName:@"Roboto-Regular" size:12.0];
self.username.font = [UIFont fontWithName:@"Roboto-Light" size:10.0];
}

- (void)initializeColors {
self.respondLabel.backgroundColor = [[FFFColorManager sharedManager] colorForApplicationColorIdentifier:ApplicationColorIdentifierQuestionCardSectionRespondBackground];
self.containerView.backgroundColor = [[FFFColorManager sharedManager] colorForApplicationColorIdentifier:ApplicationColorIdentifierTableViewBackground];

UIColor *cardForegroundColor = [[FFFColorManager sharedManager] colorForApplicationColorIdentifier:ApplicationColorIdentifierQuestionCard];
self.title.backgroundColor = cardForegroundColor;
self.subtitle.backgroundColor = cardForegroundColor;
}

@end

最佳答案

已解决。

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

关于ios - 为什么我的自定义 UITableViewCell 宽度在初始加载时不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29927378/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com