UIStackView中的重叠视图
我有一个水平堆栈视图,我添加了排列子视图(7个单元格)。 堆栈中的每个单元格都有一个超过视图边界(负面约束)的圆形徽章。 运行时,如下所示,每个单元格位于前一个单元格的徽章顶部。 我想改变顺序,这样徽章就会完全可见。
尝试使用Z索引播放,但没有帮助,因为图层在某种程度上不够平坦,如下图所示:
任何想法或build议如何做到这一点?
谢谢。
UIStackView类的文档告诉:
子视图数组的顺序定义子视图的Z顺序。 如果视图重叠,具有较低索引的子视图出现在具有较高索引的子视图后面。
这正是我在这个问题上所经历的。 为了达到我的具体情况,我做了把视图的语义改为RTL的技巧,如下所示:
这不包括一般情况,因为设备可能已经在其全局设置中被设置为RTL语言。 对于通用的情况下,我想我将需要检查界面语义,并强制我的堆栈视图的相反方向。
PS这是一种破解,所以关于如何以不同的方式重新sorting子视图Z顺序的任何想法将是最受欢迎的!
从iOS 9.0开始,可以独立设置堆栈视图子视图的z顺序和排列。 使用新的arrangedSubviews
属性来指定堆栈视图的轴上的子视图排列。 并使用subviews
属性根据数组中的索引指定子视图z顺序。
堆栈视图确保其arrangedSubviews
的子subviews
属性始终是其subviews
属性的子集。
ArrangeSubviews的文档
这个Swift 4解决scheme使用UIView方法sendSubview(toBack:)
( docs here )反转堆栈视图子视图顺序:
@IBOutlet weak var stackView: UIStackView! for view in stackView.arrangedSubviews { stackView.sendSubview(toBack: image) }
当我们前进通过堆栈视图的排列视图(从下到上)时,较晚的(即较高的)视图被推到底部,从而颠倒了顺序:-)
另一个想法可能是设置子视图(7个单元格)的背景颜色为默认( 完全透明 )。 并且只将堆栈视图的背景设置为白色 。
我有一个类似的问题,但每个子视图都必须有一个特定的背景。 而在我的情况下,你的黑客可能会帮助…😉感谢!
下面是UIStackView
上的一个简单扩展,用于反转UIStackView
的子视图的z索引,并可以select需要布局:
extension UIStackView { func reverseSubviewsZIndex(setNeedsLayout: Bool = true) { let stackedViews = self.arrangedSubviews stackedViews.forEach { self.removeArrangedSubview($0) $0.removeFromSuperview() } stackedViews.reversed().forEach(addSubview(_:)) stackedViews.forEach(addArrangedSubview(_:)) if setNeedsLayout { stackedViews.forEach { $0.setNeedsLayout() } } } }