我有一个包含多个堆栈视图的viewcontroller。按下按钮时,相应的uiview将在原始视图内变为全屏。有一个不同的按钮,可以让uiview回到原来的stackview。 uiview本身包含其他视图。我这样做有些问题。 uiview最终会在stackview中结束,但不会像过去那样接近相同的大小/位置。我不知道如何解决这个问题,并且现在已经进行了几个小时,看着多个来源。
这是使uiview全屏显示的代码:
private func moveToFrontOfCardView(v: UIView) {
originalView = v.superview
if let stack = originalView as? UIStackView {
stack.removeArrangedSubview(v)
}
myCardView.addSubview(v)
let topConstraint = NSLayoutConstraint(item: v, attribute: .top, relatedBy: .equal, toItem: myCardView, attribute: .top, multiplier: 1, constant: 10)
let bottomConstraint = NSLayoutConstraint(item: v, attribute: .bottom, relatedBy: .equal, toItem: myCardView, attribute: .bottom, multiplier: 1, constant: -10)
let leftConstraint = NSLayoutConstraint(item: v, attribute: .left, relatedBy: .equal, toItem: myCardView, attribute: .left, multiplier: 1, constant: 10)
let rightConstraint = NSLayoutConstraint(item: v, attribute: .right, relatedBy: .equal, toItem: myCardView, attribute: .right, multiplier: 1, constant: -10)
myCardView.addConstraints([topConstraint, bottomConstraint, leftConstraint, rightConstraint])
}
这是我希望它返回时使用的代码:
private func moveToOriginalPosition(v: UIView) {
if let stack = originalView as? UIStackView {
stack.addArrangedSubview(v)
}
}
有没有人知道如何解决这个问题?
修改 我已经尝试过Saqib和Bilals的回答,但我得到了这个结果:
答案 0 :(得分:2)
声明用于跟踪视图索引的类变量
var selectedIndex = 0 // Contains Current Seleceted view's index
overrie func viewDidLoad() { ...
在从stackview中删除视图之前,获取视图索引,如selectedIndex = stack.subviews.index(of: v)
继续引用所有约束。
在添加之前,请禁用所有约束topConstraint.isActive = false
现在使用stack.insertArrangedSubview(view, at: selectedIndex)
另一种选择是创建一个相同的新视图,只是隐藏/取消隐藏stackview中的视图。 StackView会自动为隐藏视图填充空间。
答案 1 :(得分:1)
根据您不需要删除原始视图的内容。您可以复制它然后显示全屏复制。然后,当您关闭此副本时,您将释放对它的引用
答案 2 :(得分:1)
当您希望再次将视图添加到stackView时,您应该取消激活从stackView中删除时添加到视图中的约束。
为此你应该创建viewController类的约束实例,然后编写你的moveToOriginalPosition(v: UIView)
方法:
private func moveToOriginalPosition(v: UIView) {
if let stack = originalView as? UIStackView {
stack.addArrangedSubview(v)
topConstraint.isActive = false
bottomConstraint.isActive = false
leftConstraint.isActive = false
rightConstraint.isActive = false
}
}
当然,你应该从moveToFrontOfCardView(v: UIView)
方法中删除这些代码行:
self.topConstraint = NSLayoutConstraint(item: v, attribute: .top, relatedBy: .equal, toItem: myCardView, attribute: .top, multiplier: 1, constant: 10)
self.bottomConstraint = NSLayoutConstraint(item: v, attribute: .bottom, relatedBy: .equal, toItem: myCardView, attribute: .bottom, multiplier: 1, constant: -10)
self.leftConstraint = NSLayoutConstraint(item: v, attribute: .left, relatedBy: .equal, toItem: myCardView, attribute: .left, multiplier: 1, constant: 10)
self.rightConstraint = NSLayoutConstraint(item: v, attribute: .right, relatedBy: .equal, toItem: myCardView, attribute: .right, multiplier: 1, constant: -10)
myCardView.addConstraints([topConstraint, bottomConstraint, leftConstraint, rightConstraint])
并将其添加到初始化视图的位置。并在moveToFrontOfCardView(v: UIView)
方法中用以上行替换下面的行:
topConstraint.isActive = true
bottomConstraint.isActive = true
leftConstraint.isActive = true
rightConstraint.isActive = true