0

我有以下布局UITableViewCell

在此处输入图像描述

布局由两个子视图组成:

  • TopView(包含一个Show按钮)
  • BottomViewShow(按下按钮时展开或折叠)。

BottomView由 3 个子视图组成。这些子视图的约束是:

  • 三个子视图中的每一个都包含一个UILabel固定到 的leadingtop以及trailing具有常量 == 8 的边。

  • 使用 >= 8 的约束将 固定到 的底部。这会强制与UILabel的顶部对齐。UIViewUILabelUIView

  • 三个中最左边的一个UIViews固定在 的前沿BottomView

  • 三者中最右边的UIViews被固定在BottomView
  • 这三个中的每一个UIViews都固定在顶部BottomView
  • 这三个中的每一个UIViews都固定在底部BottomView
  • 三个视图具有相等的宽度和高度。
  • 的底部BottomView被固定到UITableViewCell内容视图的底部

这给了我我想要的布局:

在此处输入图像描述

我想要完成的是以下内容:

  1. 最初,BottomView应该是折叠的。
  2. 单击Show按钮应根据需要展开或折叠BottomView

我设法通过创建一个bottomViewHeightConstraint最初卸载的来做到这一点。点击show按钮激活/停用约束。

另一个TableViewCell.m

-(IBAction) show
{
    self.bottomViewHeightConstraint.active = !self.bottomViewHeightConstraint.active;
     [UIView animateWithDuration:0.3 animations:^{
        [self layoutIfNeeded];
        [self.delegate cellRequiresUpdates:self];
    } completion:^(BOOL finished) {

    }];
}

UIViewController.m

-(void) cellRequiresUpdates:(AnotherTableViewCell *)cell
{
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

这很有效,但对不可满足的约束产生了很多警告。我想帮助了解我的哪些限制导致了警告。 不可满足的约束是:

  1. bottomViewHeightConstraint== 0

(需要,因为我想折叠底视图)

  1. UIView最左边和最右边的高度相等UIBottomView

(尝试停用,但警告没有消失)

  1. 最左边的 UIView 底部和底部之间的 8 像素距离BottomView

(尝试停用,但警告没有消失)

  1. 最左边的 UIView 底部和底部之间的 8 像素距离BottomView

(尝试停用,但警告没有消失)

4

2 回答 2

1

好的 - 这可以解决您的问题。在处理最近的一个类似问题时,我在 Apple 的文档中遇到了这个问题:

注意不要觉得有义务使用所有 1000 个优先级值。事实上,优先级通常应围绕系统定义的低 (250)、中 (500)、高 (750) 和所需 (1000) 优先级。您可能需要设置比这些值高或低一到两点的约束,以帮助防止出现平局。如果您超出此范围,您可能需要重新检查布局的逻辑。

当然,在 IB 中创建约束时,它们似乎默认使用 1000。

因此,对于您的特定布局...

选择底部视图上的所有约束,除了Bottom View Height Constraint

在此处输入图像描述

并将其更改Priority998

然后,选择Bottom View Height Constraint并将其设置Priority999

运行您的应用程序并显示/隐藏底部视图到您心中的内容:)

参考:https ://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/AnatomyofaConstraint.html#//apple_ref/doc/uid/TP40010853-CH9-SW19

于 2017-06-23T14:30:48.543 回答
0

一些粗略和现成的代码可以满足您的需求-

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    var expanded: [Bool] = [false, false, false, false]


    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.delegate = self
        self.tableView.dataSource = self

        self.tableView.rowHeight = UITableViewAutomaticDimension;
        self.tableView.estimatedRowHeight = 64.0
    }



    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 4
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! ExpandingCell

        cell.isExpanded = self.expanded[indexPath.row]

        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        if let cell = tableView.cellForRow(at: indexPath) as? ExpandingCell {

            let isExpanded = !self.expanded[indexPath.row]

            self.expanded[indexPath.row] = isExpanded
            cell.isExpanded = isExpanded

            tableView.beginUpdates()
            tableView.endUpdates()
        }
    }
}


class ExpandingCell: UITableViewCell {

    @IBOutlet weak var label: UILabel!

    public var isExpanded = false {
        didSet {
            if self.isExpanded {
                self.label.text = "Lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots & lots of text"
            } else {
                self.label.text = "Not a lot of text"
            }
        }
    }
}

请记住,您在单元格中的视图必须限制在 contentView 的顶部和底部,正确完成自动布局意味着当您在这种情况下更改标签的内容时,单元格将正确调整大小。

于 2017-06-23T13:33:23.727 回答