添加和删除 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的主要内容,如果未能解决你的问题,请参考以下文章