【发布时间】:2017-03-19 14:11:25
【问题描述】:
我正在尝试使用UIStackView 构建一个堆栈视图,它始终最多显示 3 个视图,但也可以同时显示一个、1 个或 2 个视图。
整个堆栈视图应该是动态的。一开始,堆栈视图是空的。另一个函数将在顶部添加一个带有stackView.insertArrangedSubview(at: 0) 的新视图。如果添加了另一个视图,那么索引 0 处的前一个视图应该被推送到索引 1。这就是我选择 UIStackView 的原因,因为它负责对现有视图进行重新排序。
当第三个视图被推入时,另外两个将再次向下移动一个插槽。现在,如果第四个视图被推入,所有之前的三个视图将再次向下移动,但第四个将从堆栈视图中移除。
这里有一个额外的小条件:
第一个索引处的视图应始终是其余 2 个视图大小的两倍。所以第一个视图应该是整个堆栈视图的 50%。因此,索引 1 和 2 处的视图高度应为 25%。
如果一个新视图被推入,当前位于索引 0 的视图将因此必须缩小,向下移动到中间,然后移动到堆栈视图的索引 1。
这个想法类似于Growl Notification System 的工作方式。
image 显示了视图的基本布局。
所以现在的问题是,UIStackViews 是解决此问题的正确方法还是仅使用约束(例如使用 SnapKit)是更好的方法?即使使用UIStackView,我也可能需要有很多约束才能满足要求。
所以也许我应该只拥有一个 addNewView 函数来更新所有约束并在 UIView.animate 块中调用 layoutIfNeeded 以使视图的转换向下推其他视图并且最后一个视图被推出?
你们怎么看?如果存在已经做类似事情的框架,我也将不胜感激。
【问题讨论】:
-
我希望Q&A 作为起点对您有所帮助...
-
这种动态的任何东西都可能需要约束和 UIStackviews。您可以在将视图添加到堆栈视图之前向视图添加宽度约束,并且堆栈视图将尊重这些约束。但这是一个非常广泛的问题——您只需要编写代码并使其工作即可。
标签: ios swift architecture uistackview