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

Posted

技术标签:

【中文标题】添加和删​​除 UIStackViews 弄乱了我的 UIScrollView【英文标题】:Adding and removing UIStackViews messing up my UIScrollView 【发布时间】:2018-09-11 19:31:12 【问题描述】:

每当我使用 pickerview 将视图从 Auto Rent 切换到 Schedule Rent 时,它都能完美运行。当我从 Schedule Rent 切换到 Auto Rent 时,会出现这个黑条。我已经附加了我的内容视图的层次结构。 I thought it had to do with previous constraints added, so I remove a StackView whenever one view is chosen.例如,如果选择了 Auto Rent,那么我将删除 Schedule View 所在的 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 没有限制。

编辑:

突出显示的屏幕是滚动视图。紧随其后的是 contentView。 UIWindow 后面变黑了。

我顶部的标题栏不知何故出现在中间。

【问题讨论】:

尝试将隐藏堆栈视图的逻辑放置在 UIView.animate 动画块中 我之前试过了,还是不行。 使用视图调试器,黑色区域是滚动视图内容的一部分,还是滚动视图底部向上移动并暴露该区域? 我现在要做视图调试器,但我几乎 100% 是滚动视图在移动。我在顶部有一个导航栏,它消失了,因为整个视图都向上移动了。 @GrahamPerks 我编辑了我的帖子以显示视图调试器 【参考方案1】:

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

 stack.distribution = .equalCentering

之后你就不需要使用这个了:

 .removeArrangedSubview()
 .addArrangedSubview()

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

【讨论】:

发行版没有任何改变。【参考方案2】:

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

如果内容视图是堆栈视图,您也可以使用布局约束将其固定到底部并使用内容分布。

【讨论】:

我没有固定它。这不应该是回应。将此作为评论添加到我的帖子下。 嘿,埃里克,当然。顺便说一句,如果您将其固定到超级视图的底部,它应该可以解决您的问题,正如我提到的那样 但我的内容视图不是堆栈视图 @EricAgredo 无论如何都要固定它,所以它不会缩小 我做到了。你是说给 0 的内容视图一个底部锚约束,对吗?不工作【参考方案3】:

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

当在 stackView 中隐藏视图时,它会自动移除。

所以我认为你可以隐藏或显示 stackViewMain.subviews[0] o 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;

【讨论】:

以上是关于添加和删​​除 UIStackViews 弄乱了我的 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

自动布局弄乱了我的动画

Php 弄乱了我的上传大小

Rails 弄乱了我的 Postgres TIME 列

Firebase (FCM) 响应弄乱了我的响应

Xcode 更新到 4.3.2 弄乱了我的证书

Wordpress 在 wordpress 页面上弄乱了我的数据库调用?