safeAreaLayoutGuide 不适用于 systemLayoutSizeFittingSize

Posted

技术标签:

【中文标题】safeAreaLayoutGuide 不适用于 systemLayoutSizeFittingSize【英文标题】:safeAreaLayoutGuide not work for systemLayoutSizeFittingSize 【发布时间】:2019-03-13 02:13:17 【问题描述】:

我在 ios 11 中这样使用安全区域:

code picture

/** mainTableView **/
[self.view addSubview:self.mainTableView];
[self.mainTableView makeConstraints:^(MASConstraintMaker *make) 
    make.left.equalTo(self.view.left);
    make.right.equalTo(self.view.right);
    if (@available(iOS 11.0,*)) 
        self.mainTableViewTop = make.top.equalTo(self.view.mas_safeAreaLayoutGuideTop).offset(navHeight).priorityLow();
        self.mainTableViewBottom = make.bottom.equalTo(self.view.mas_safeAreaLayoutGuideBottom).offset(0).priorityLow();
    else
        self.mainTableViewTop = make.top.equalTo(self.view.top).offset(navHeight + iAStatusHeight).priorityLow();
        self.mainTableViewBottom = make.bottom.equalTo(self.view.bottom).offset(-tabHeight);
    
];

然后在 iPhone X 上运行

iPhone X layout picture

那么,顶部约束和底部约束在哪里?

适配器没问题。但是当我想获取视图的高度时,它总是返回 0。

像这样:

我想在我的视图中计算 tableview 的高度:

tableview height

[self.mainTableView reloadData];
dispatch_async(dispatch_get_main_queue(),^
    if ([self isShowRefreshFooter]) 
        CGFloat mainTableHeight = [self.mainTableView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
        CGFloat contentHeight = self.mainTableView.contentSize.height;
        if (contentHeight < mainTableHeight) 
            self.reFreshFooter.hidden = YES;
        else
            self.reFreshFooter.hidden = YES;
        
    
);

但 mainTableHeight 总是返回 0

return 0

请帮帮我

【问题讨论】:

【参考方案1】:

在下面修复它:

第 1 步:

_detailTableView.estimatedRowHeight = UITableViewAutomaticDimension;

第 2 步:

[bgView addSubview:self.detailTableView];
[self.detailTableView makeConstraints:^(MASConstraintMaker *make) 
    make.top.equalTo(titleLabel.bottom).offset(16).priorityHigh();
    make.left.equalTo(bgView.left).offset(0);
    make.right.equalTo(bgView.right).offset(0);
    make.bottom.equalTo(bgView.bottom).offset(0);
    make.height.equalTo(100).priorityHigh();
];

[self.detailTableView reloadData];
[self.detailTableView layoutIfNeeded];
CGFloat contentHeight = self.detailTableView.contentSize.height;
[self.detailTableView updateConstraints:^(MASConstraintMaker *make) 
    make.height.equalTo(contentHeight).priorityHigh();
];

【讨论】:

以上是关于safeAreaLayoutGuide 不适用于 systemLayoutSizeFittingSize的主要内容,如果未能解决你的问题,请参考以下文章

safeAreaLayoutGuide - 横向模式

如何修复 SafeAreaLayoutGuide

如何修复 - safeAreaLayoutGuide' 仅适用于 iOS 11.0 或更高版本

旋转设备后 safeAreaLayoutGuide 未更新

safeAreaLayoutGuide - 横向模式

在 Snapkit 中,tableViewController 上的 safeAreaLayoutGuide 不起作用