2017-03-17 75 views
1

前言:我看了一眼this post,它并没有解决我的问题。这是一个link to a repo,显示我遇到的错误。隐藏嵌套UISTackviews的UIStackView

我有一个UIViewController垂直UIStackView包含嵌套水平UIStackViews

有两个UIStackViews是切换。如果显示UIStackViewNumber1,则UIStackViewNumber2隐藏&反之亦然。我最初设置的视图显示,但它太拥挤。

UIStackView 
    stackViewThatDoesntMove 
    stackViewNumber1 
    stackViewNumber2 
    stackViewThatDoesntMove 

如果我不隐藏任何东西,一切正常,没有AutoLayout错误。在UIStackViews的每一个嵌套了包含按钮,标签,滑块,等我发现的观点是太拥挤stackViews,所以我想我会设置隐藏stackViews之一和动画的变化,具体如下:

stackViewNumber2.isHidden = true 

UIView.animate(withDuration: 0.33, 
       options: [.curveEaseOut], 
       animations: { 
       self.stackViewNumber1.layoutIfNeeded() 
       self.stackViewNumber2.layoutIfNeeded() 
       self.view.layoutIfNeeded() 
        }, 
       completion: nil) 
} 

虽然我在Simulator和物理设备上获得了期望的结果,但是当我隐藏其中一个UIStackViews时,我的控制台填满了AutoLayout错误。

我看了一下this post,我的问题看起来很简单。我采用最少的“簿记”方法,并在UIView中包装stackViewNumber2。我最终得到的是我原来没有将stackViewNumber1包含在UIView中的一组错误。

我也看了Apple's documentation on UIStackView并试图玩弄的arrangedSubviews()设置的限制isActive = false,如下:

for subview in stackViewNumber2.arrangedSubviews { 
    for constraint in subview.constraints { 
     constraint.isActive = false 
    } 
} 

stackViewNumber2.updateConstraints() 
// then run animation block to update view 

是否有隐藏嵌套UIStackViews而不用追加用于约束的IBOutlet更有效的方式,使确定它不弱,并且对isActive是否为true/false做记录?

我认为我的问题与嵌套stackViews有关,但我无法弄清楚如何解决它。感谢您的阅读,我欢迎有关如何隐藏包含嵌套UIStackViewsUIStackView的建议。

+0

更改动画块内的隐藏属性是否有任何不同的效果。如果需要,离开布局? – agibson007

+0

@ agibson007感谢您的阅读。不,它没有任何不同的效果。 – Adrian

+0

嵌套stackviews包含什么?他们是否在评估内容大小,还是在设定内容?另外什么是设置垂直持有水平。试图描绘它,以及可能会有什么阻碍。而不是取消激活约束,而不是隐藏内部堆栈视图如果在动画块中隐藏这些堆栈视图的子视图会发生什么情况。 – agibson007

回答

2

而不是隐藏我认为它会更好地删除堆栈视图本身。

myStackView.removeArrangedSubview(playButton) 
playButton.removeFromSuperview() 

希望它有帮助。

+1

更清洁,没有错误,没有簿记!我将在下面发布我的最终解决方案,主要基于您的解决方案。谢谢! – Adrian

1

我开始想要隐藏一个视图并取消隐藏另一个视图,但在Md. Ibrahim Hassan's suggestion处,我尝试从超级视图中移除stackViewNumber1,并用stackViewNumber2替换它。最终的结果是更为干净具有最小记账,没有拖动bazillion @IBOutlets到的viewController用于更新约束等

parentStackView的意见被存储在堆栈的在他们显示在Main.storyboard顺序arrangedSubviews()阵列英寸

enter image description here

在这个例子中,arrangedSubviews阵列看起来像这样:

[topStackView, stackViewNumber1, stackViewNumber2, stopButton]

我只需要知道parentStackViewstackViewNumber1,并stackViewNumber2,所以我拖着3口到故事板如下:

// StackViews the viewController needs to know about... 
@IBOutlet weak var parentStackView: UIStackView! 
// note weak is removed from the following 2 stackViews 
@IBOutlet var stackViewNumber1: UIStackView! 
@IBOutlet var stackViewNumber2: UIStackView! 

Fr OM那里,如果我想删除stackViewNumber2,下面的代码删除它:

parentStackView.removeArrangedSubview(stackViewNumber2) 
// parentStackView.arrangedSubviews() = [topStackView, stackViewNumber1, stopButton] 
stackViewNumber2.removeFromSuperview() 
parentStackView.insertArrangedSubview(stackViewNumber1, at: 1) 
// parentStackView.arrangedSubviews() = [topStackView, stackViewNumber1, stopButton] 

现在,让我们说,我要拿出stackViewNumber1,并取代它与stackViewNumber2

parentStackView.removeArrangedSubview(stackViewNumber1) 
// parentStackView.arrangedSubviews() = [topStackView, stopButton] 
stackViewNumber2.removeFromSuperview() 
parentStackView.insertArrangedSubview(stackViewNumber2, at: 1) 
// parentStackView.arrangedSubviews() = [topStackView, stackViewNumber2, stopButton] 

召回stackViewNumber1stackViewNumber2不是weak。原因是我想让他们周围,所以我可以交换他们进出。我没有看到由于将网点更改为weak而对内存使用造成任何不利影响。

最终结果:我用最初的方法遇到的一系列AutoLayout错误没有了大量的簿记工作。

更新:

随着多一点修修补补,我有动画的工作了。代码如下:

UIView.animate(withDuration: 0.25, 
        delay: 0, 
        usingSpringWithDamping: 2.0, 
        initialSpringVelocity: 10.0, 
        options: [.curveEaseOut], 
        animations: { 
        self.view.layoutIfNeeded() 
    }, 
        completion: nil) 
相关问题