Ios 如何使用自动布局约束在使用EstimatedHeightForrowatineXpath估计高度的表格单元格中放置两个大小可变的标签
我有下面的布局和下面的约束 当我运行它时,它看起来就像所希望的那样。单元格高度将调整以适合所有文本 但是,我在问题导航器中看到以下警告,我不明白为什么 2个视图在垂直方向上不明确Ios 如何使用自动布局约束在使用EstimatedHeightForrowatineXpath估计高度的表格单元格中放置两个大小可变的标签,ios,swift,ios-autolayout,Ios,Swift,Ios Autolayout,我有下面的布局和下面的约束 当我运行它时,它看起来就像所希望的那样。单元格高度将调整以适合所有文本 但是,我在问题导航器中看到以下警告,我不明白为什么 2个视图在垂直方向上不明确 视图中的高度和垂直位置不明确 视图的高度不明确 布局: 限制条件: 视图(单元格中所有元素的单元格包装视图) 视图(选项1包装视图) 按钮(选项1按钮) 标签(选项1标签) 视图(选项2包装视图) 按钮(选项2按钮) 标签(选项2标签) 表视图控制器代码: 我认为按钮的SuperVi
- 视图中的高度和垂直位置不明确
- 视图的高度不明确
- 视图(单元格中所有元素的单元格包装视图)
- 视图(选项1包装视图)
- 按钮(选项1按钮)
- 标签(选项1标签)
- 视图(选项2包装视图)
- 按钮(选项2按钮)
- 标签(选项2标签)
- 视图(选项1包装视图)
我认为按钮的SuperView边缘没有任何顶部和底部约束。因此,它们的超级视图(两个包装视图)不知道它们的高度。故事板似乎在抱怨,因为它不知道单元格视图的高度,它不知道您将在运行时使用
EstimatedHeightForRowatineXpath提供高度。所有约束都是相对于SuperView或其他视图的,因此有无限的方法来满足这些约束
抑制这些警告的最简单方法是为单元格的内容视图指定一个明确的高度,然后在右侧导航器上选中该约束的“在生成时删除”框(在左侧导航器上找到该约束,然后单击该约束)
给出一个显式数字将允许编译器为这些视图的高度和y位置提供显式值,这将解决您收到的警告。然后,删除该约束将允许单元格使用您实现的方法在代码中动态调整大小。我通过添加约束“将中心Y对齐到superview”来居中调整按钮,因为我需要根据文本的大小使按钮与文本对齐,这就是我使用包装器视图的原因。我同意你的观点,按钮可能是个问题,但为了验证这一点,我删除了所有按钮并运行了它,我仍然看到相同的警告,因此按钮不是问题所在。@Jace在这种情况下,我认为你的两个SuperView混淆了它们的高度。可以将包装视图2的底部设置为与其superview对齐,也可以将标签2的底部边缘设置为与包装视图2对齐。但我们知道标签有自己的高度设置(取决于其内容)。因此,包装视图2不知道如何设置其高度。要解决此问题,您可以尝试删除包装器视图1和2中的底部空间到superview
约束。删除底部空间到superview约束确实消除了警告,但现在当我运行视图时,视图被切断,我只能看到屏幕上过去的25%左右。您能提供一个屏幕截图吗?但我想您可以将标签的行号设置为0,以便根据需要为其提供尽可能多的行。我尝试向两个有问题的包装器视图添加高度约束,并按照您的建议选中了“在生成时删除”选项,但是在更新了所有的约束之后,所有的东西都不合适了,主包装器视图的高度现在为零,所以我再也看不到任何元素了。我应该将您的建议应用于哪些元素以及哪些元素?我在3个包装视图(包含所有内容的主包装视图和每个选项的2个子包装视图)中添加了高度约束。我给每个人一个估计的高度,然后按建议选中“在构建时删除”选项。这似乎已经成功了,我再也看不到警告了,当我运行它时,它看起来仍然很好。谢谢
import UIKit
class SelectionTableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
//Hide navigation bar
self.navigationController?.navigationBarHidden = true
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// MARK: Hide status bar
override func prefersStatusBarHidden() -> Bool {
return true
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 2
}
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
}