如何将高度设置为从 xib 加载的 tableFooterView

Posted

技术标签:

【中文标题】如何将高度设置为从 xib 加载的 tableFooterView【英文标题】:How do I set the height to a tableFooterView loaded from a xib 【发布时间】:2015-06-22 21:07:56 【问题描述】:

我有一个 UITableView,我正在添加从 xib 加载的 tableFooterView

var footer = NSBundle.mainBundle().loadNibNamed("AFooterView", owner: self, options: nil).first as! AFooterView
self.tableView.tableFooterView = footer

这很好用,但我需要能够设置此页脚的高度。 xib 只有一个垂直和水平居中的UIImageView,因此无论视图的高度如何,它都会适应。

我不知道如何使用AutoLayout 做到这一点?正确的道路是什么?

【问题讨论】:

您可以在约束中添加一个出口来管理视图的高度,并将它的常量更改为您想要的大小 - 在将其分配给 tableFooterView 是否有理由不直接在 xib 中设置页脚视图的高度? 我无法在 xib 中设置它,因为高度发生了变化,我不知道如何使用自动布局进行动态布局...@JJC 您不会在这里设置约束,因为约束定义了两个对象之间的关系,在这种情况下,您直接设置页脚视图而不是将其添加为子视图。如果你想控制页脚视图的高度,你只需要在分配给tableFooterView之前调整它的框架的高度。 【参考方案1】:

很抱歉让您感到困惑,这是更新后的答案:

我知道您可以通过设置框架高度来做到这一点,但它也可以通过在 imageView 完成加载后重新分配页脚视图来使用自动布局。

// either let auto layout calculate the frame, or set the frame yourself
// I set the width to an arbitrary size but it doesn't seem to matter, 
// it will automatically be adjusted by the tableview when you assign it
CGFloat width = 100;
CGFloat height = 500;
footerView.frame = CGRectMake(0, 0, width, height);
// this is the "trick": re-assign the footerView after its size has been updated 
// so that the tableView will show it correctly
tableView.tableFooterView = footerView;

欲了解更多信息,请参阅Resizing a UITableView’s tableHeaderView

最初的答案是关于节页脚,而不是表视图页脚

【讨论】:

很抱歉造成混乱;如果您已经设置并计算了所有约束(如果您自己设置了框架高度也可以使用),只需将页脚视图重新分配给表格。表格将识别出它有一个新的页脚并重新做任何需要发生的布局以使页脚的适当大小:yourTableView.tableFooterView = yourFooterView; 我在 iPhone 上旋转到横向时遇到奇怪的行为,tableFooterView 高度变得随机,有时小有时很大,找不到关系 @АндрейПервушин 您是否添加了所有必需的约束? ios 是否会记录有关您的约束的任何警告,例如模棱两可、删除一些约束或其他任何内容?尝试检查约束是否正确。 所有约束都是正确的,必须使用此解决方法来修复:github.com/away4m/Vendors/blob/…【参考方案2】:

如果您使用Autolayout 并从xib 加载HeaderFooter View,则应添加constraints

func setupTableFooterView() 
    // Create your footer view from XIB and set constraints (in my case it is historyToolBarView of class HistoryToolBarView)
    let view = Bundle.main.loadNibNamed("HistoryToolBarView", owner: self, options: nil)?.first
    historyToolBarView = view as! HistoryToolBarView
    historyToolBarView.translatesAutoresizingMaskIntoConstraints = false
    historyToolBarView.addConstraints(
        [NSLayoutConstraint.init(item: self.historyToolBarView,
                                 attribute: .height,
                                 relatedBy: .equal,
                                 toItem: nil,
                                 attribute: .notAnAttribute,
                                 multiplier: 1.0,
                                 constant: 60),
         NSLayoutConstraint.init(item: self.historyToolBarView,
                                 attribute: .width,
                                 relatedBy: .equal,
                                 toItem: nil,
                                 attribute: .notAnAttribute,
                                 multiplier: 1.0,
                                 constant: UIScreen.main.bounds.size.width)])

    // Create a container of your footer view called footerView and set it as a tableFooterView
    let footerView = UIView(frame: CGRect.init(x: 0, y: 0, width: tableView.frame.width, height: 60))
    footerView.backgroundColor = UIColor.green
    tableView.tableFooterView = footerView

    // Add your footer view to the container
    footerView.addSubview(historyToolBarView)

【讨论】:

我看不出这是如何使用自动布局的,因为返回的视图是硬编码的宽度和高度。如果这只是因为 footerView 没有剪裁边界并且子视图溢出了设置的 60 高度。

以上是关于如何将高度设置为从 xib 加载的 tableFooterView的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 - 从 xib 加载的 UITableViewCell - 自动布局和高度不正确

如何将 xib 文件加载为自定义类?

iOS UITableView tableHeaderView 高度变了

在 UIScrollView 中未正确加载 XIB

从 xib 加载子类时如何设置子类 UIView 属性的值

将 Xib 的大小调整为 swift 4 的屏幕大小