修改if语句的Swift约束

vom3gejh  于 2023-09-30  发布在  Swift
关注(0)|答案(5)|浏览(106)

下面是我的表格视图行/单元格:

在适当的位置设置了约束-ImageView在标签下面,而按钮在ImageView下面。
下面是我代码:

if(row == 1) {
    imageview.hidden = false
} else {
    imageview.hidden = true
}

我怎么能改变这按钮约束从下面imageview到下面标签?

scyqe7ek

scyqe7ek1#

添加和删除约束是一个非常糟糕的例子。我会让你的UI更复杂。
解决这些自动布局问题的最佳方法是添加两个约束。一个从imageViewbutton,第二个从imageViewlabel
现在,在设置这些约束之后,您需要设置它们的priority级别。因此,假设button将首先低于imageView。在这种情况下,您需要将imageView to button constraint的优先级设置为750或UILayoutPriorityDefaultHigh,并将label to button constraint的优先级设置为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)
}

你应该都准备好了。

qcbq4gxm

qcbq4gxm2#

您可以尝试使用StackView,当您告诉要隐藏的东西时,imageView堆栈视图将调整StackView,就好像imageView从未是视图的一部分,并且这是一个轻松的工作,不必担心约束。

l5tcr1uw

l5tcr1uw3#

你可以在constraint上创建IBOutlet,然后像这样简单地修改值:

buttonConstraint.constant = newValue

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

bvjveswy

bvjveswy4#

你可以这样做,而不是躲起来。
1.从imageview的heights约束创建一个outlet,现在称之为constraint。
1.设置constraint.constant = 0 //实际上与隐藏相同。
1.设置constraint.constant = NON_ZERO_VALUE //与show相同。
希望有帮助!

uxh89sit

uxh89sit5#

我有几个选择。第一种方法更容易实现,但如果您决定以后更改布局,则不太灵活。
1.使按钮的约束位于标签下方。保持对这个约束的引用(如果你使用的是故事板,你可以通过故事板将它连接到你的代码中,就像你对按钮本身所做的那样)。当imageView可见时,设置myConstraint.constant += myImageView.frame.height。当imageView隐藏时,设置myConstraint.constant -= myImageView.frame.height。然后,调用view.setNeedsLayout来更新约束。
1.设置两个约束:一个用于图像下方,一个用于标签下方(“constraintToImage”和“constraintToLabel”)。像选项1一样将它们都连接到控制器,并在图像可见时调用view.addConstraint(constraintToImage)view.removeConstraint(constraintToLabel)(当图像隐藏时则相反)。同样,在之后调用view.setNeedsLayout

相关问题