我有这个问题。我使用集合视图作为主视图的子视图UIViewController
。集合视图被固定到超级视图大小,因此它有 4 个约束,即前导、尾迹、顶部和底部,常量等于 0。单元格是子类,UICollectionViewCell
由以下各项组成:
- 第一个标题视图
- 第二个标题视图
UITableView
集合视图单元是从 xib 加载的,视图界面是为 4 英寸设备制作的。
第一个标题视图固定在顶部、尾端、前导位置,常量为 0,高度固定到其父视图。
第二个标题视图被限制为第一个标题视图,垂直间距等于 0,固定高度,固定轨迹,以常量 0 引导到其父视图。
表格视图被限制为第二个标题视图,垂直间距等于 0,并且固定尾迹、前导和底部,其父视图为常数 0。
在 4 英寸屏幕上一切正常,但是当我在 3.5 上加载时我遇到了一些问题,事实是我想创建UITableViewCell
一个动态高度。高度应该是UITableView
按行数潜水,这样它们就会出现在屏幕上。
表视图委托和数据源仅在我设置需要加载的数据并且在创建它之后发生,但在从数据源方法返回集合视图单元之前发生。
在子类的-layoutSubviews
方法中,UICollectionViewCell
我将 tableview 行高设置为所需的值
- (void) layoutSubviews {
[super layoutSubviews];
self.answerTableView.rowHeight = self.answerTableView.bounds.size.height / self.quizSection.answers.count;
}
事实是,这里的表格视图仍然没有调整大小,因此结果 rowHeight 是错误的,该值与我在 4 英寸显示器中收到的值相同。超级视图(contentView
集合视图单元格的)没问题,但表格视图的大小不正确。显示时,集合视图很好,除了表格视图的单元格大小错误。于是我开始追踪collection view cell的循环。
- 在 initWithFrame 方法中,集合视图单元格具有与原始 xib 相同的大小(4 英寸屏幕)
- 在视图控制器中,如果我在出列后立即询问集合视图单元格的大小,如果调整到正确的屏幕大小,但里面的表格视图不是
- 加载数据并设置委托和数据源后,collection view 可以,但是 tableview 不行
- 在
-updateConstraints
集合视图单元格中,表格视图大小仍然错误 - 在
-layoutSubviews
集合视图单元格中,表格视图大小仍然错误 - 表格视图的dtasource方法第一次调用返回正确的大小
我找到了使用委托方法的解决方案- (float) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
,但我真的很好奇为什么其他方法不起作用,有人可以解释为什么吗?
THX
[帮助代码]
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) { // Initialization code
NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];
if ([arrayOfViews count] < 1) { return nil; }
if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) { return nil; }
self = [arrayOfViews objectAtIndex:0];
[self.answerTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:AnswerCellIdentifier];
}
return self;
}
- (void) layoutSubviews {
[super layoutSubviews];
self.answerTableView.rowHeight = self.answerTableView.bounds.size.height / self.quizSection.answers.count; //WRONG
}
- (void) updateConstraints {
[super updateConstraints];
self.answerTableView.rowHeight = self.answerTableView.bounds.size.height / self.quizSection.answers.count; //WRONG
}
#pragma mark -
#pragma mark custom getter/setter
- (void) setQuizSection:(QuizSection *)quizSection {
if (_quizSection == quizSection) {
return;
}
_quizSection = quizSection;
//Set data
self.questionLabel.text = _quizSection.question[KEY_TEXT];
self.answerTableView.delegate = self;
self.answerTableView.dataSource = self;
}
#pragma mark -
#pragma mark TableViewDelegate TableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.quizSection.answers.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:AnswerCellIdentifier];
NSDictionary * answerDict = self.quizSection.answers[indexPath.row];
cell.textLabel.text = answerDict[KEY_TEXT];
return cell;
}