systemLayoutSizeFittingSize:UILayoutFittingCompressedSize不压缩

时间:2015-04-25 13:23:46

标签: objective-c uitableview ios7 ios8 autolayout

我在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大小计算大小?

2 个答案:

答案 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的警告非常重要。