更改if语句的Swift约束

时间:2016-07-01 18:59:15

标签: ios swift uitableview constraints

这是我的tableview行/单元格:

enter image description here

设置了约束 - 图像视图位于标签下方,按钮位于图像视图下方。

这是我的代码:

if(row == 1) {
    imageview.hidden = false
} else {
    imageview.hidden = true
    //how can i change the button constraint from below imageview to below label?

5 个答案:

答案 0 :(得分:1)

你可以尝试使用StackView,当你告诉隐藏的东西时,imageView的堆栈视图会调整StackView,好像imageView从来不是视图的一部分,这是一个简单的工作,不必担心约束。

答案 1 :(得分:1)

添加和删除约束是非常糟糕的例子。我会让你的用户界面更复杂。

解决这些自动布局问题的最佳方法是添加两个约束。一个从imageViewbutton,第二个从imageViewlabel

现在,在设置这些约束后,您需要设置其priority级别。所以,假设button首先低于imageView。在这种情况下,您需要将imageView设置为按钮约束的优先级为750或UILayoutPriorityDefaultHigh,并将按钮约束的优先级标记为250或UILayoutPriorityDefaultLow

让我们开始创建自定义UITableViewCell

class YourTableViewCell: UITableViewCell {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var buttonToLabelConstraint: NSLayoutConstraint!
    @IBOutlet weak var buttonToImageViewConstraint: NSLayoutConstraint!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }

    func shouldHideImageView(hidden: Bool) {
        if(hidden == false) {
          buttonToLabelConstraint.priority = UILayoutPriorityDefaultLow
          buttonToImageViewConstraint.priority = UILayoutPriorityDefaultHigh
          imageView.hidden = true
        } else {
          buttonToLabelConstraint.priority = UILayoutPriorityDefaultHigh
          buttonToImageViewConstraint.priority = UILayoutPriorityDefaultLow
          imageView.hidden = false
        }
        self.contentView.layoutIfNeeded()
    }
}

之后,在放置tableView的类中实现类似的逻辑:

if(row == 1) {
  cell.shouldHideImageView(true)
} else {
  cell.shouldHideImageView(false)
}

你应该全力以赴。

答案 2 :(得分:0)

您可以在约束上创建IBOutlet,然后只需更改此值:

buttonConstraint.constant = newValue

但我建议您为此创建一个tableView。在这种情况下,我认为你的代码和逻辑会更准确。

答案 3 :(得分:0)

你可以这样而不是隐藏。

  1. 从imageview的高度限制中创建一个出口,暂时将其称为约束。
  2. 设置constraint.constant = 0 //与隐藏有效相同。
  3. 设置constraint.constant = NON_ZERO_VALUE //与show相同。
  4. 希望它有所帮助!

答案 4 :(得分:0)

我看到了几个选项。第一个更容易实现,但如果您决定稍后更改布局,则会稍微灵活一些。

  1. 使按钮的约束位于标签下方。保持对此约束的引用(您可以通过故事板将其连接到您的代码,就像使用按钮本身一样,如果您使用的是故事板)。当imageView可见时,设置myConstraint.constant += myImageView.frame.height。隐藏imageView时,请设置myConstraint.constant -= myImageView.frame.height。然后,请致电view.setNeedsLayout以更新您的约束。

  2. 制作两个约束:一个用于图像下方,另一个用于标签下方(“constraintToImage”和“constraintToLabel”)。将它们连接到控制器,如选项1中所示,并在图像变得可见时调用view.addConstraint(constraintToImage)view.removeConstraint(constraintToLabel)(与隐藏时相反)。再次,请在{。

  3. 之后致电view.setNeedsLayout