添加和删​​除UIStackViews弄乱了我的UIScrollView

时间:2018-09-11 19:31:12

标签: ios iphone swift

每当我使用pickerview将视图从“自动租用”切换到“计划租用”时,它都可以正常工作。当我从“计划租金”切换为“自动租金”时,会出现此黑条。我已经附加了内容视图的层次结构。我认为这与以前添加的约束有关,因此,只要选择了一个视图,便会删除StackView。例如,如果选择了“自动租用”,那么我将删除“计划”视图所在的StackView:

//Holds Temp Stackviews
var stackViewHolder1: UIView?
var stackViewHolder2: UIView?
 override func viewDidLoad() {
    super.viewDidLoad()


    stackViewHolder1 = stackViewMain.arrangedSubviews[0]
    stackViewHolder2 = stackViewMain.arrangedSubviews[1]
 }

if txtRentType.text == "Auto Rent" {
   let tempView = stackViewHolder1
   let tempView1 = stackViewHolder2
   tempView!.isHidden = true
   stackViewMain.removeArrangedSubview(tempView!)
   if(tempView1!.isHidden == true){
       tempView1!.isHidden = false
       stackViewMain.addArrangedSubview(tempView1!)
   }
else{

      let tempView = stackViewHolder1
      let tempView1 = stackViewHolder2

      tempView1!.isHidden = true
      stackViewMain.removeArrangedSubview(tempView1!)

      if(tempView!.isHidden == true){
          tempView!.isHidden = false
          stackViewMain.addArrangedSubview(tempView!)
      }

    }

我尝试删除一个视图并切换仅一个视图被隐藏,这消除了黑条问题。 stackViews和Content View没有限制。

编辑: enter image description here

突出显示的屏幕是scrollView。后一个是contentView。 UIWindow在背面变黑。

enter image description here

位于顶部的我的标题栏以某种方式终止于中间。

3 个答案:

答案 0 :(得分:0)

您可以尝试修改堆栈分配属性

 stack.distribution = .equalCentering

您将不需要使用它之后:

 .removeArrangedSubview()
 .addArrangedSubview()

当您隐藏某个视图时,另一视图占据了堆栈的所有空间,您无需更新约束。您可以在界面生成器上尝试一下,看看它如何工作。

答案 1 :(得分:0)

您是否将滚动视图和内容视图固定在约束的底部?

如果内容视图是堆栈视图,则可以将其固定在底部以及布局约束并使用内容分发。

答案 2 :(得分:0)

您不需要使用删除/添加已安排的子视图。

将视图隐藏在stackView中时,视图会自动删除。

所以我认为您可以隐藏或显示stackViewMain.subviews [0]或stackViewMain.subviews [1]

我与objc在一起也许是我做错了,但这可能是这样的:

if txtRentType.text == "Auto Rent" {
       stackViewMain.arrangedSubviews[0].isHidden = true;
       stackViewMain.arrangedSubviews[1].isHidden = false;
}else{
       stackViewMain.arrangedSubviews[1].isHidden = true;
       stackViewMain.arrangedSubviews[0].isHidden = false;
}