UITableHeaderView 自动布局中的 UILabel 不适用于 iPhone 6

Posted

技术标签:

【中文标题】UITableHeaderView 自动布局中的 UILabel 不适用于 iPhone 6【英文标题】:UILabel in UITableHeaderView autoLayout not working for iPhone 6 【发布时间】:2015-11-22 09:50:15 【问题描述】:

我在 TableHeaderView 中为 UILabel 使用自动布局。 UILabel 的高度不是固定的,可能是单行也可能是多行。我在 ViewController 中编码:

    override func viewDidLayoutSubviews() 
    super.viewDidLayoutSubviews()

    if let headerView = tableView.tableHeaderView 
        let height = headerView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
        var headerFrame = headerView.frame

        if height != headerFrame.size.height 
            headerFrame.size.height = height
            headerView.frame = headerFrame
            tableView.tableHeaderView = headerView
        
    

它在 iPhone 5 上完美运行。但是,在 iPhone 6 上,当 UILabel 是单行时,它会消失。

这里是错误日志

    2015-11-22 16:50:42.338 Basket[11898:996678] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x7f97840bd210 h=--& v=--& H:[UIView:0x7f9784072380(375)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x7f97840bd2b0 h=--& v=--& V:[UIView:0x7f9784072380(363.5)]>",
    "<NSLayoutConstraint:0x7f9784032650 UIImageView:0x7f97840705a0.width == 1.33333*UIImageView:0x7f97840705a0.height>",
    "<NSLayoutConstraint:0x7f9784073a40 V:[UILabel:0x7f9784073e90'Funnybeer'(15)]>",
    "<NSLayoutConstraint:0x7f9784128b40 V:[UILabel:0x7f9784128940'Nino Mamaladze'(15)]>",
    "<NSLayoutConstraint:0x7f9784074d10 H:[UIImageView:0x7f97840705a0]-(0)-|   (Names: '|':UIView:0x7f9784072380 )>",
    "<NSLayoutConstraint:0x7f9784074d60 H:|-(0)-[UIImageView:0x7f97840705a0]   (Names: '|':UIView:0x7f9784072380 )>",
    "<NSLayoutConstraint:0x7f9784074e00 V:|-(0)-[UIImageView:0x7f97840705a0]   (Names: '|':UIView:0x7f9784072380 )>",
    "<NSLayoutConstraint:0x7f9784074f40 V:[UIImageView:0x7f97840705a0]-(0)-[UIView:0x7f9784073d20]>",
    "<NSLayoutConstraint:0x7f9784075080 V:[UIView:0x7f9784073d20]-(22)-[UILabel:0x7f9784073e90'Funnybeer']>",
    "<NSLayoutConstraint:0x7f9784075210 V:[UILabel:0x7f9784073e90'Funnybeer']-(3)-[UILabel:0x7f9784128940'Nino Mamaladze']>",
    "<NSLayoutConstraint:0x7f9784075260 V:[UILabel:0x7f9784074300'see you on friday :)']-(0)-|   (Names: '|':UIView:0x7f9784072380 )>",
    "<NSLayoutConstraint:0x7f9784075350 'summary top distance' V:[UILabel:0x7f9784128940'Nino Mamaladze']-(10)-[UILabel:0x7f9784074300'see you on friday :)']>",
    "<NSLayoutConstraint:0x7f9781cf59f0 'tool height' V:[UIView:0x7f9784073d20(44)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7f9781cf59f0 'tool height' V:[UIView:0x7f9784073d20(44)]>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

我的故事板在这里 有人可以帮助我吗?

【问题讨论】:

没什么可看的,只是它可能是由于前两行使用 NSAutoresizingMaskLayoutConstraint 引起的。是否有任何视图使用自动布局而不将 translatesAutoresizingMaskIntoConstraints 设置为 NO? 我在情节提要中为 UILabel 添加了约束,只是没有大小的 pin。我是否必须在代码中将 UILabel translatesAutoresizingMaskIntoConstraints 设置为 NO? 没有,我想你可以用 dasdom 的回答来解决它。 @RickvanderLinde 不幸的是,它不起作用。我的问题不是 UILabel resize tableHeaderView,请看我问题中的图片。 【参考方案1】:

Marco Arment 有一个 great gist 告诉你如何做到这一点。

【讨论】:

它不工作。我说,iPhone 5 好用,iPhone 6 不行。请看我问题中的图片。

以上是关于UITableHeaderView 自动布局中的 UILabel 不适用于 iPhone 6的主要内容,如果未能解决你的问题,请参考以下文章

iOS 调整 UITableheaderView 的大小

如何更改 UITableHeaderView 的背景颜色和文本颜色

Xcode 6 - 另一个自动布局视图中的自动布局视图

自动更新自动布局中的框架[关闭]

Interface Builder 中的自动布局根据外部视图的宽度/高度更改布局

自动布局中的比例距离约束