我把它取出后,如何将uiview放回到堆栈视图中?

时间:2018-04-24 10:02:24

标签: swift autolayout uistackview

我有一个包含多个堆栈视图的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])
}

Original size

这是我希望它返回时使用的代码:

private func moveToOriginalPosition(v: UIView) {
    if let stack = originalView as? UIStackView {
        stack.addArrangedSubview(v)
    }
}

enter image description here

有没有人知道如何解决这个问题?

修改 我已经尝试过Saqib和Bilals的回答,但我得到了这个结果:

enter image description here

3 个答案:

答案 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