【问题标题】:Adjusting Container View's Height to Match Embedded UITableView调整容器视图的高度以匹配嵌入式 UITableView
【发布时间】:2023-03-08 13:10:01
【问题描述】:

使用 Storyboards 和 Autolayout,我有一个 UIViewController 和一个 UIScrollView 作为主视图。我在滚动视图中嵌入了几个容器视图。其中一些嵌入式容器视图包含 UITableViews,每个都有不同高度的单元格。我需要 tableView 的高度足够大,以便一次显示所有单元格,因为 tableView 上的滚动将被禁用。

在主 UIViewController 中,必须定义容器视图的高度才能使滚动视图正常工作。这是有问题的,因为一旦所有不同高度的单元格完成渲染,我就无法知道我的 tableView 会有多大。 如何在运行时调整容器视图的高度以适应非滚动 UITableView?

到目前为止,我已经完成了以下工作:

// in embedded UITableViewController
// 
- (void)viewDidLoad {
  // force layout early so I can determine my table's height
  [self.tableView layoutIfNeeded];

  if (self.detailsDelegate) {
        [self.detailsTableDelegate didDetermineHeightForDetailsTableView:self.tableView];
  }
}

// in my main UIViewController
// I have an IBOutlet to a height constraint set up on my container view
// this initial height constraint is just temporary, and will be overridden
// once this delegate method is called
- (void)didDetermineHeightForDetailsTableView:(UITableView *)tableView
{
  self.detailsContainerHeightConstraint.constant = tableView.contentSize.height;
}

效果很好,我对结果很满意。但是,我还有一两个容器视图要添加,它们将具有非滚动 tableViews,并且我不想为每个容器视图创建一个新的委托协议。我不认为我可以使我拥有的协议通用。

有什么想法吗?

【问题讨论】:

  • 我面临着类似的问题。您找到解决方案了吗?
  • @ntsh 我刚刚添加了自己的答案。看看是否对你有帮助
  • 谢谢。通过使用 tableView 的 contentSize,我也得到了类似的解决方案。

标签: ios objective-c uitableview storyboard autolayout


【解决方案1】:

这是我最终做的:

// In my embedded UITableViewController:
- (void)viewDidLoad
{
    [super viewDidLoad];

    self.tableView.rowHeight = UITableViewAutomaticDimension;
    self.tableView.estimatedRowHeight = 60.0;

    // via storyboards, this viewController has been embeded in a containerView, which is
    // in a scrollView, which demands a height constraint. some rows from our static tableView
    // might not display (for lack of data), so we need to send our table's height. we'll force
    // layout early so we can get our size, and then pass it up to our delegate so it can set
    // the containerView's heightConstraint.
    [self.tableView layoutIfNeeded];

    self.sizeForEmbeddingInContainerView = self.tableView.contentSize;
}

// in another embedded view controller:    
- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    self.sizeForEmbeddingInContainerView = self.tableView.contentSize;
}

// then, in the parent view controller, I do this:
// 1) ensure each container view in the storyboard has an outlet to a height constraint
// 2) add this:
- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    self.placeDetailsContainerHeightConstraint.constant = self.placeDetailsTableViewController.sizeForEmbeddingInContainerView.height;
    self.secondaryExperiencesContainerHeightConstraint.constant = self.secondaryExperiencesViewController.sizeForEmbeddingInContainerView.height;
}

我还没有这样做,但最好创建一个每个子视图控制器都可以采用的具有CGSize sizeForEmbeddingInContainerView 属性的协议。

【讨论】:

  • 我相信我最终创建了协议。
【解决方案2】:

这对我来说非常有效。

- (void)updateSizeBasedOnChildViews {

    // Set height of container to match embedded tableview
    CGRect containerFrame = self.cardTableContainer.frame;
    containerFrame.size.height = [[[self.cardTableContainer subviews] lastObject]contentSize].height;
    self.cardTableContainer.frame = containerFrame;

    // Set content height of scrollview according to container
    CGRect scrollFrame = self.cardTabScrollView.frame;
    scrollFrame.size.height = containerFrame.origin.y + containerFrame.size.height;
            //  + height of any other subviews below the container
    self.cardTabScrollView.contentSize = scrollFrame.size;
}

【讨论】:

  • 你把这个调用放在哪里 - 哪个方法?我的问题是我尝试在 didMoveToParentViewController 之后立即执行此操作并且控制器尚未加载,但我无法弄清楚如何让容器视图控制器知道何时加载子项。
  • @SAHM 在我的例子中,我在为 tableViewController 设置数据后调用了它(它调用 [tableView reloadData])。不过那是两年多以前的事了,所以不记得具体的细节了。我的最终代码是:在 viewDidAppear: [self updateChildViewData] 然后 - (void)updateChildViewData { [self updateChildTableVCData];[self updateSizeBasedOnChildViews] }
猜你喜欢
  • 2019-03-26
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 2016-08-21
  • 1970-01-01
  • 2015-01-05
相关资源
最近更新 更多