【问题标题】:Get table view size of child view controller获取子视图控制器的表视图大小
【发布时间】:2014-10-28 10:54:30
【问题描述】:

在我的子视图控制器 (UITableViewController) 的 viewDidLoad 中,我在调用 layoutIfNeeded 后得到了 contentSize.Height。比我用这些值设置preferredContentSize。在我的容器(包含这个孩子)的viewDidLoad 中,我还根据孩子的preferredContentSize 设置了preferredContentSize。这适用于 iOS 8,但不适用于 iOS 7。

我知道子视图控制器的viewDidLoad是在容器的viewDidLoad之后调用的。

如何获取子视图的表格视图大小,或者如何强制子视图在容器之前布局其子视图?

【问题讨论】:

    标签: ios uitableview uipopovercontroller uicontainerview


    【解决方案1】:

    您可以在所有视图加载完毕后尝试发送布局请求:

    // In the container
    -(void) viewDidLoad {
    
        // ...
    
        [self.view performSelector:@selector(setNeedsLayout) withObject:nil afterDelay:0];
    
    }
    

    【讨论】:

    • 感谢您的回复。我试过了,但 contentSize 在孩子中仍然是空的,所以容器得到零值。似乎在 iOS 7 中,视图控制器还没有准备好(没有计算帧)。在viewDidAppear 我可以查询contentSize 但为时已晚。
    • 你试过用layoutSubviews代替layoutIfNeeded吗?如果这不起作用,您可能需要手动计算高度...
    • 现在我在我的子视图控制器的viewDidLoad 中使用layoutSubviews 进行了尝试。我仍然得到相同的结果(零值)。我想我会尝试手动计算高度。谢谢!
    【解决方案2】:

    我最终得到了以下结果:

    在子视图控制器中,我创建了一个单独的方法来获取表格视图的值。然后我设置了首选的内容大小。

    public void setDocumentList(List<string> documentList){
        this.documentList = documentList;
    
        this.TableView.ReloadData ();
    
        // adjust size for popover
        float height = TableView.ContentSize.Height;
        if (this.View.Bounds.Height > 0) {
            // limit the max size of the popover
            height = Math.Min (this.View.Bounds.Height, height);
        }
        this.PreferredContentSize = new SizeF (320f, height);
    }
    

    在我的容器中我有一个类似的功能,但是这里我只设置了首选的内容大小。

    public void setDocumentList(List<string> documentList){
        documentListController.setDocumentList (documentList);
        this.PreferredContentSize = documentListController.PreferredContentSize;
    
        // some autolayout constraints ...
    }
    

    这种作品。我得到了正确的值,但弹出框的值一开始就不正确。如果有人想知道这是 C# 语言。我仍然愿意寻求更好的解决方案。

    【讨论】:

      【解决方案3】:

      可以通过在parent中调用child的viewDidLoad来加载child的tableView,并强制tableview进行布局。

      // Parent.m
      [Child view];
      [self layoutParentViewsOrDoSomething];
      
      // Child.m
      
      -(void)viewDidLoad{
       [super viewDidLoad];
       [self layoutSubviews];
      // or [tableView reloadData]... 
      }
      

      【讨论】:

        猜你喜欢
        • 2021-05-18
        • 2021-04-07
        • 1970-01-01
        • 2014-06-11
        • 2017-07-03
        • 2012-10-10
        • 2017-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多