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() } } } }