【问题标题】:Change height constraint of table view outside of viewDidAppear in iOS 7在 iOS 7 中更改 viewDidAppear 之外的表视图的高度约束
【发布时间】:2014-06-21 06:32:33
【问题描述】:

在我的视图控制器的 .xib 文件中,我使用了 UITableView,它具有动态的行数。因为它不是 .xib 文件中的唯一元素(它的上下还有其他元素),所以我需要在知道行数后更改它的高度约束。 为了实现这一点,我使用了this solution,它工作得很好。
因此:

@implementation MyViewController
{
__weak IBOutlet UITableView *_tableView;
__weak IBOutlet NSLayoutConstraint *_tableViewHeightConstraint;
}

- (void)viewDidAppear:(BOOL)animated
{
 [super viewDidAppear:animated];
 [self adjustHeightOfTableview];
}

- (void)adjustHeightOfTableview
{
 CGFloat height = _tableView.contentSize.height;
_tableViewHeightConstraint.constant = height;
[self.view needsUpdateConstraints];
}

现在这工作正常,但问题是当显示 ViewController 时您可以看到高度发生变化(因为在 viewDidAppearof 当然这样做)。
我想避免这种情况并且当 ViewController 被显示时,它应该直接显示所需的高度。
我试过在viewDidLayoutSubviews 中调用adjustHeightOfTableview 而不是viewDidAppear,正如建议的here 那样,但这给了我这个错误:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after sending -viewDidLayoutSubviews to the view controller. MyViewController's implementation needs to send -layoutSubviews to the view to invoke auto layout.'

我注意到,如果我在 adjustHeightOfTableview 方法的末尾调用 [self.view layoutSubviews];,那么我不会收到任何错误,但我的表格视图根本不可见。使用viewDidAppear 中的调试器检查_tableView.contentSize.height,表明它具有正确的值。 (根据我的行数)

在我的adjustHeightOfTableview 方法结束时调用[self.view layoutIfNeeded];[self.view setNeedsLayout]; 与调用[self.view layoutSubviews]; 具有相同的行为:没有错误,但我的表格视图不可见。

以防万一,我使用的是自定义UITableViewCell

有人知道我做错了什么吗?

【问题讨论】:

    标签: objective-c uitableview ios7 constraints autolayout


    【解决方案1】:

    将代码从viewDidAppear: 移动到viewWillAppear:。它们大致相同,并且对大致相同的事情有效,但viewWillAppear: 发生在用户的视线之外,这正是您所追求的。 (您可能需要先显式调用表格上的reloadData,以便为其提供一些数据。)

    【讨论】:

    • 我也试过了,但正如提到的here 它不起作用可能是因为子视图的框架尚未在viewWillAppear 中设置,正如提到的here。当我设置断点并检查这条线CGFloat height = _tableView.contentSize.height;时,高度为0。还有其他想法吗?
    • 也许问题只是你需要先调用reloadData(在viewWillAppear:中),以便表格获取一些数据。
    • 这就是问题所在!在调整高度约束之前在viewWillAppear 中调用[_tableView reloadData]; 可以解决问题。您能否编辑您的答案,使其也包含此信息,以便其他人更容易找到?非常感谢!
    • 我很高兴它成功了。但是,在 viewDidLayoutSubviews 中执行此操作也应该有效。
    • 我不知道为什么没有。 _tableView.contentSize.height 具有正确的值,但表格视图不可见。也许我错过了一些东西。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2023-04-11
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2016-06-14
    相关资源
    最近更新 更多