如何解决Swift视图未正确隐藏子视图
在底部更新
在我的ViewController
中,我有一个TableView
和CustomCells
。在那些cells
中呈现的内容取决于userInput
。我认为解释该问题的最佳方法是实际显示它:
1。将cells
添加到tableView
:
2。问题:关闭ViewController
后返回到原来的位置:
showing views that should actually be hidden in the first cell
顺便说一句,当我在调试器中打开View-Hirarchy时,它显示正确!!
这里还有另一个video
,可以使您更好地理解:video
在这种情况下,我没有添加image
,但是返回到viewController
时,它仍显示第一个单元格的imageContainerView
(阴影)和content
代码:
我的代码非常复杂且混乱,因此您可以在这里关注我:
CustomCell
中的setupViews:
我认为这不是很有帮助,但是我也不认为setup
是这里的问题。
func setupViews(){
contentView.addSubview(checkButton)
contentView.addSubview(mainStackView)
// main StackView
mainStackView.addArrangedSubview(label)
mainStackView.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
mainStackView.leadingAnchor.constraint(equalTo: checkButton.trailingAnchor,constant: 15).isActive = true
mainStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor,constant: -30).isActive = true
mainStackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
//constrain wish label
labelHeightConatraint = label.heightAnchor.constraint(equalToConstant: 50)
labelHeightConatraint.priority = .defaultHigh
labelHeightConatraint.isActive = true
// constrain checkButton
checkButton.leadingAnchor.constraint(equalTo: contentView.leadingAnchor,constant: 30).isActive = true
checkButton.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true
checkButton.widthAnchor.constraint(equalToConstant: 40).isActive = true
checkButton.heightAnchor.constraint(equalToConstant: 40).isActive = true
mainStackView.addArrangedSubview(secondaryStackView)
secondaryStackViewHeightConstraint = secondaryStackView.heightAnchor.constraint(equalToConstant: 90)
secondaryStackViewHeightConstraint.priority = .defaultHigh
secondaryStackViewHeightConstraint.isActive = true
secondaryStackView.addArrangedSubview(imageContainerView)
imageContainerWidthConstraint = imageContainerView.widthAnchor.constraint(equalToConstant: 90)
imageContainerWidthConstraint.priority = .defaultHigh
imageContainerWidthConstraint.isActive = true
imageContainerView.addSubview(shadowLayer)
shadowLayer.widthAnchor.constraint(equalToConstant: 80).isActive = true
shadowLayer.heightAnchor.constraint(equalToConstant: 80).isActive = true
shadowLayer.topAnchor.constraint(equalTo: imageContainerView.topAnchor).isActive = true
shadowLayer.trailingAnchor.constraint(equalTo: imageContainerView.trailingAnchor,constant: -10).isActive = true
imageContainerView.addSubview(wishImage)
wishImage.widthAnchor.constraint(equalToConstant: 80).isActive = true
wishImage.heightAnchor.constraint(equalToConstant: 80).isActive = true
wishImage.topAnchor.constraint(equalTo: imageContainerView.topAnchor).isActive = true
wishImage.trailingAnchor.constraint(equalTo: imageContainerView.trailingAnchor,constant: -10).isActive = true
secondaryStackView.addArrangedSubview(thirdHelperView)
thirdHelperView.addSubview(thirdStackView)
thirdHelperViewHeightConstraint = thirdHelperView.heightAnchor.constraint(equalToConstant: 90)
thirdHelperViewHeightConstraint.priority = .defaultHigh
thirdHelperViewHeightConstraint.isActive = true
thirdStackView.addArrangedSubview(priceView)
priceView.heightAnchor.constraint(equalToConstant: 30).isActive = true
priceView.addSubview(priceImage)
priceView.addSubview(priceLabel)
thirdStackView.addArrangedSubview(linkView)
linkView.heightAnchor.constraint(equalToConstant: 30).isActive = true
linkView.addSubview(linkImage)
linkView.addSubview(linkTextView)
thirdStackView.addArrangedSubview(noteView)
noteView.heightAnchor.constraint(equalToConstant: 30).isActive = true
noteView.addSubview(noteImage)
noteView.addSubview(noteLabel)
priceImage.topAnchor.constraint(equalTo: priceView.topAnchor).isActive = true
priceImage.leadingAnchor.constraint(equalTo: thirdStackView.leadingAnchor).isActive = true
priceImage.heightAnchor.constraint(equalToConstant: 20).isActive = true
priceImage.widthAnchor.constraint(equalToConstant: 20).isActive = true
priceLabel.topAnchor.constraint(equalTo: priceView.topAnchor).isActive = true
priceLabel.leadingAnchor.constraint(equalTo: priceImage.trailingAnchor,constant: 10).isActive = true
priceLabel.trailingAnchor.constraint(equalTo: priceView.trailingAnchor,constant: -10).isActive = true
linkImage.topAnchor.constraint(equalTo: linkView.topAnchor).isActive = true
linkImage.leadingAnchor.constraint(equalTo: thirdStackView.leadingAnchor).isActive = true
linkImage.heightAnchor.constraint(equalToConstant: 20).isActive = true
linkImage.widthAnchor.constraint(equalToConstant: 20).isActive = true
linkTextView.topAnchor.constraint(equalTo: linkView.topAnchor).isActive = true
linkTextView.leadingAnchor.constraint(equalTo: linkImage.trailingAnchor,constant: 10).isActive = true
linkTextView.trailingAnchor.constraint(equalTo: linkView.trailingAnchor,constant: -10).isActive = true
noteImage.topAnchor.constraint(equalTo: noteView.topAnchor).isActive = true
noteImage.leadingAnchor.constraint(equalTo: thirdStackView.leadingAnchor).isActive = true
noteImage.heightAnchor.constraint(equalToConstant: 20).isActive = true
noteImage.widthAnchor.constraint(equalToConstant: 20).isActive = true
noteLabel.topAnchor.constraint(equalTo: noteView.topAnchor).isActive = true
noteLabel.leadingAnchor.constraint(equalTo: noteImage.trailingAnchor,constant: 10).isActive = true
noteLabel.trailingAnchor.constraint(equalTo: noteView.trailingAnchor,constant: -10).isActive = true
}
更重要的是:cellForRowAt
,我实际上根据内容隐藏/显示不同的视图。如您所见,如果内容为空(它在第一个单元格中),我实际上会在.isHidden
上调用ImageContainerView,priceView,linkView & noteView
override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: WhishCell.reuseID,for: indexPath) as! WhishCell
cell.label.text = ""
cell.linkTextView.text = ""
cell.priceLabel.text = ""
cell.noteLabel.text = ""
cell.wishImage.image = UIImage()
let currentWish = self.wishData[indexPath.row]
cell.label.text = currentWish.name
cell.linkTextView.hyperLink(originalText: "Link öffnen",hyperLink: "Link öffnen",urlString: currentWish.link)
cell.priceLabel.text = currentWish.price
cell.noteLabel.text = currentWish.note
cell.wishImage.image = currentWish.image
cell.setupSuccessAnimation()
cell.noteView.isHidden = false
cell.priceView.isHidden = false
cell.linkView.isHidden = false
cell.imageContainerView.isHidden = false
cell.secondaryStackViewHeightConstraint.constant = 0
cell.thirdHelperViewHeightConstraint.constant = 0
if currentWish.image == nil || !currentWish.image!.hasContent {
cell.imageContainerView.isHidden = true
print("but its truue: \(cell.imageContainerView.isHidden)")
if currentWish.price != "" {
cell.thirdHelperViewHeightConstraint.constant += 30
cell.secondaryStackViewHeightConstraint.constant += 30
}
if currentWish.link != "" {
cell.thirdHelperViewHeightConstraint.constant += 30
cell.secondaryStackViewHeightConstraint.constant += 30
}
if currentWish.note != "" {
cell.thirdHelperViewHeightConstraint.constant += 30
cell.secondaryStackViewHeightConstraint.constant += 30
}
} else {
cell.secondaryStackViewHeightConstraint.constant = 90
cell.thirdHelperViewHeightConstraint.constant = 90
}
if currentWish.price == "" {
cell.priceView.isHidden = true
}
if currentWish.link == "" {
cell.linkView.isHidden = true
}
if currentWish.note == "" {
cell.noteView.isHidden = true
}
return cell
}
我不知道为什么会这样。我不认为该设置有什么问题,因为如果我实际添加了cells
,它就可以正常工作。它只是在实际应有的时候不隐藏视图。 cellheight
也可以正常工作。只是该死的躲藏...
我知道很多事情,但我希望我的问题很清楚。如果您还需要其他任何东西,请告诉我!
更新:
我在print-statements
内添加了两个cellForRowAt
,实际上是在打印:
print("but its truue: \(cell.imageContainerView.isHidden)")
print("but its truue: \(cell.shadowLayer.isHidden)")
但事实却如此:
但其道理是:假
因此,即使imageConatinerView
是shadowLayer
的{{1}},它也正确地隐藏了shadowLayer
而不是subView
?我被困在这里...
解决方法
您可以使用UIView调试方法来调试UI。 有四种有用的调试方法:
- hasAmbiguousLayout:
- exerciseAmbiguityInLayout:
- exerciseAmbiguityInLayout:
- _autolayoutTrace:
然后您可以使用Xcode UI调试来查看您的UI
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。