如何使用autolayout设置tableHeaderView(UITableView)的高度?

 手机用户2502875927 发布于 2023-02-05 12:40

在过去的3到4个小时里,我一直把头撞在墙上,我似乎无法弄明白.我有一个UIViewController,里面有一个全屏UITableView(屏幕上有一些其他的东西,这就是为什么我不能使用UITableViewController)我想让我的tableHeaderView用autolayout调整大小.不用说,它不合作.

见下面的截图.

在此输入图像描述

因为overviewLabel(例如"此处列出概述信息."文本)具有动态内容,所以我使用autolayout来调整它的大小和它的超级视图.除了tableHeaderView之外,我已经很好地调整了所有内容,它位于层次结构中的Paralax Table View之下.

我发现调整标题视图大小的唯一方法是以编程方式,使用以下代码:

CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = headerFrameHeight;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];

在这种情况下,headerFrameHeight是tableViewHeader高度的手动计算,如下所示(innerHeaderView是白色区域,或者第二个"View",headerView是tableHeaderView):

CGFloat startingY = self.innerHeaderView.frame.origin.y + self.overviewLabel.frame.origin.y;
CGRect overviewSize = [self.overviewLabel.text
                       boundingRectWithSize:CGSizeMake(290.f, CGFLOAT_MAX)
                       options:NSStringDrawingUsesLineFragmentOrigin
                       attributes:@{NSFontAttributeName: self.overviewLabel.font}
                       context:nil];
CGFloat overviewHeight = overviewSize.size.height;
CGFloat overviewPadding = ([self.overviewLabel.text length] > 0) ? 10 : 0; // If there's no overviewText, eliminate the padding in the overall height.
CGFloat headerFrameHeight = ceilf(startingY + overviewHeight + overviewPadding + 21.f + 10.f);

手动计算有效,但如果将来发生变化,它会很笨拙并容易出错.我想要做的是让tableHeaderView根据提供的约束自动调整大小,就像你可以在其他地方一样.但对于我的生活,我无法弄明白.

关于这个问题有几个关于此的帖子,但没有一个是明确的,最后让我更加困惑.这里有几个:

UITableViewHeader上的自动布局

tableHeaderView的自动布局

是否可以将AutoLayout与UITableView的tableHeaderView一起使用?

使用自动布局,IB和字体大小时,表头视图高度是错误的

将translatesAutoresizingMaskIntoConstraints属性更改为NO并不是真的有意义,因为这只会导致我的错误,并且无论如何在概念上都没有意义.

真的很感激任何帮助!

编辑1: 感谢TomSwift的建议,我能够弄明白.而不是手动计算概览的高度,我可以按如下方式为我计算,然后像以前一样重新设置tableHeaderView.

[self.headerView setNeedsLayout];
[self.headerView layoutIfNeeded];
CGFloat height = [self.innerHeaderView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height + self.innerHeaderView.frame.origin.y; // adding the origin because innerHeaderView starts partway down headerView.

CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = height;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];

编辑2:正如其他人所说,编辑1中发布的解决方案似乎在viewDidLoad中不起作用.但是,它似乎适用于viewWillLayoutSubviews.示例代码如下:

// Note 1: The variable names below don't match the variables above - this is intended to be a simplified "final" answer.
// Note 2: _headerView was previously assigned to tableViewHeader (in loadView in my case since I now do everything programatically).
// Note 3: autoLayout code can be setup programatically in updateViewConstraints.
- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];

    [_headerWrapper setNeedsLayout];
    [_headerWrapper layoutIfNeeded];
    CGFloat height = [_headerWrapper systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

    CGRect headerFrame = _headerWrapper.frame;
    headerFrame.size.height = height;
    _headerWrapper.frame = headerFrame;
    _tableView.tableHeaderView = _headerWrapper;
}

TomSwift.. 35

您需要使用该UIView systemLayoutSizeFittingSize:方法来获取标题视图的最小边界大小.

我在本Q/A中提供了有关使用此API的进一步讨论:

如何调整superview的大小以适应autolayout的所有子视图?

3 个回答
  • 您需要使用该UIView systemLayoutSizeFittingSize:方法来获取标题视图的最小边界大小.

    我在本Q/A中提供了有关使用此API的进一步讨论:

    如何调整superview的大小以适应autolayout的所有子视图?

    2023-02-05 12:42 回答
  • 我真的与这一个进行斗争并将设置放入viewDidLoad对我来说不起作用,因为未在viewDidLoad中设置框架,我还最终得到了大量凌乱的警告,其中封装的自动布局高度减少到0我在表单演示文稿中展示tableView时,才注意到iPad上的问题.

    解决这个问题的原因是在viewWillLayoutSubviews而不是viewDidLoad中设置tableViewHeader.

    func viewWillLayoutSubviews() {
            super.viewWillLayoutSubviews()
            if tableView.tableViewHeaderView == nil {
                let header: MyHeaderView = MyHeaderView.createHeaderView()
                header.setNeedsUpdateConstraints()
                header.updateConstraintsIfNeeded()
                header.frame = CGRectMake(0, 0, CGRectGetWidth(tableView.bounds), CGFloat.max)
                var newFrame = header.frame
                header.setNeedsLayout()
                header.layoutIfNeeded()
                let newSize = header.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
                newFrame.size.height = newSize.height
                header.frame = newFrame
                self.tableView.tableHeaderView = header
            }
        }
    

    2023-02-05 12:42 回答
  • 我发现了一种优雅的方式来使用自动布局来调整表头的大小,有和没有动画.

    只需将其添加到View Controller即可.

    func sizeHeaderToFit(tableView: UITableView) {
        if let headerView = tableView.tableHeaderView {
            let height = headerView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
            var frame = headerView.frame
            frame.size.height = height
            headerView.frame = frame
            tableView.tableHeaderView = headerView
            headerView.setNeedsLayout()
            headerView.layoutIfNeeded()
        }
    }
    

    要根据动态更改的标签调整大小:

    @IBAction func addMoreText(sender: AnyObject) {
        self.label.text = self.label.text! + "\nThis header can dynamically resize according to its contents."
    }
    
    override func viewDidLayoutSubviews() {
        // viewDidLayoutSubviews is called when labels change.
        super.viewDidLayoutSubviews()
        sizeHeaderToFit(tableView)
    }
    

    要根据约束中的更改为调整大小设置动画:

    @IBOutlet weak var makeThisTallerHeight: NSLayoutConstraint!
    
    @IBAction func makeThisTaller(sender: AnyObject) {
    
        UIView.animateWithDuration(0.3) {
            self.tableView.beginUpdates()
            self.makeThisTallerHeight.constant += 20
            self.sizeHeaderToFit(self.tableView)
            self.tableView.endUpdates()
        }
    }
    

    请参阅AutoResizingHeader项目以查看此操作. https://github.com/p-sun/Swift2-iOS9-UI

    AutoResizingHeader

    2023-02-05 12:42 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有