代码之家  ›  专栏  ›  技术社区  ›  algrid

UITableView.tableHeaderView的子视图的autoresizingMask未按预期工作

  •  0
  • algrid  · 技术社区  · 4 年前

    我正在向我的UITableView添加一个标题视图,并希望向其中添加一个具有一些边距的子视图。

    class ViewController: UIViewController {
        
        private let tablewView = UITableView()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            view.backgroundColor = .white
            
            tablewView.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview(tablewView)
            [
                tablewView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
                tablewView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
                tablewView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
                tablewView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)
            ].forEach{ $0.isActive = true}
    
            let headerView = UIView(frame: CGRect(x: 0, y: 120, width: 200, height: 100))
            headerView.backgroundColor = .blue
            
            let subView = UIView(frame: CGRect(x: 10, y: 10, width: 180, height: 80))
            subView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
            subView.backgroundColor = .yellow
            headerView.addSubview(subView)
            
            tablewView.tableHeaderView = headerView
        }
    }
    

    问题是,当调整标题大小时(当布局表视图时),右边距不会保留。如图所示,右边距缺失:

    enter image description here

    如果我在没有UITableView的情况下使用相同的视图,那么边距将按预期保留。

    这是UIKit的bug吗?有什么变通办法吗?

    我知道我可以从这里尝试AutoLayout解决方案 Is it possible to use AutoLayout with UITableView's tableHeaderView? 但他们看起来有点暴躁。 autoresizingMask 毕竟,它应该起作用。

    0 回复  |  直到 4 年前
        1
  •  1
  •   matt    4 年前

    在Cocoa编程中,就像在喜剧中一样,时机就是一切。

    在一次性实现中添加子视图 viewDidLayoutSubviews 一切都会好起来的。子视图将正确显示,如果调整了表视图的大小(例如,由于界面的旋转),子视图将继续工作。

    所以,剪下这四行:

        let subView = UIView(frame: CGRect(x: 10, y: 10, width: 180, height: 80))
        subView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        subView.backgroundColor = .yellow
        headerView.addSubview(subView)
    

    相反:

    var didLayout = false
    override func viewDidLayoutSubviews() {
        guard !didLayout else { return }
        didLayout.toggle()
        if let h = tablewView.tableHeaderView {
            let subView = UIView(frame: h.bounds.insetBy(dx: 10, dy: 10))
            subView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
            subView.backgroundColor = .yellow
            h.addSubview(subView)
        }
    }