我在iOS 8.X和iOS7.x中遇到自动布局和UITableView标题(tableHeaderView)的问题。
self.tableView.tableHeaderView = self.HeaderView;
[self.HeaderView setNeedsLayout];
[self.HeaderView layoutIfNeeded];
CGSize headerViewSize = [self.HeaderView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
CGRect frame = self.HeaderView.frame;
frame.size.height = headerViewSize.height;
self.HeaderView.frame = frame;
self.tableView.tableHeaderView = self.HeaderView;
是使用自动布局构建的XIB。
它在滚动查看器中使用,后跟其他视图,结果是正确的。
然后我将其设置为表视图的标题(如here所述):
UILayoutFittingCompressedSize
但结果高度大于预期。我不明白为什么。约束似乎没问题,否则为什么在scrollview中结果是正确的?
如果在IB中我调整容器框架的高度,则更新约束而不会有任何歧义。
为什么systemLayoutSizeFittingSize:UILayoutFittingCompressedSize
不压缩视图?
#UPDATE
我发现了这个问题。基本上约束是正确的。
在调用layoutSubviews之后,UIImageView的大小正确。宽度和高度如预期。
问题在于systemLayoutSizeFittingSize:UILayoutFittingCompressedSize
的工作方式。
不是使用UIImageView大小(已经正确调整大小)来计算大小,而是使用UIImage的大小(源文件更大)
那么,我该怎样做才能强制 taskStructure.TasksArray.Add(new taskStructure
{
taskID = taskIDValueTxt.Text,
taskName = taskNameRTB.Text,
taskDescription = taskDescRTB.Text,
taskPriority = checkedButton,
taskDateAndTimeCompletion = finishDateAndTimeDTP.Text,
taskCompleted = mainPage.testerrr
});
使用UIImageView大小计算大小?
答案 0 :(得分:1)
找到解决方案。
简而言之,约束是可以的,在iOS 8上,systemLayoutSizeFittingSize:UILayoutFittingCompressedSize
按预期工作,但在iOS7上没有。
纯粹巧合我称之为
的组合[self.HeaderView setNeedsLayout];
[self.HeaderView layoutIfNeeded];
两次,我注意到这样, systemLayoutSizeFittingSize:UILayoutFittingCompressedSize 也在iOS 7上运行。
在那一刻,我意识到解决方案是按顺序调用上面的组合两次(在iOS 8上不是必需的)
理解为什么......
会很高兴答案 1 :(得分:-1)
这就是我的工作:我为标题视图创建约束,使其左右相等于tableview,优先级为UILayoutPriorityDefaultHigh。当标题视图移动到didMoveToWindow中的非零窗口时,我将这些约束添加到tableView:当它从willMoveToSuperview中的超级视图中删除时删除它们。设置完成后,我使用systemLayoutSizeFittingSize但传入self.frame,然后将其设置为tableHeaderView。
这似乎工作正常,包括轮换。添加/删除约束的顺序对于避免UILayout的警告非常重要。