如何在与另一个iOS重叠时显示UIView?

时间:2016-04-21 21:20:39

标签: ios uiview geometry cglayer

我正在尝试重新实现与Apple Watch Friend Picker类似的功能。我有两个UIViews,它们的角半径都是它们高度的一半,因此它们显示为圆圈。如何计算它们重叠的位置并仅显示该部分。我的UI位于第一张图片中,第二张图片包含所需的行为。在此先感谢您的帮助吗? Current UI Apple Watch UI

1 个答案:

答案 0 :(得分:1)

对于每个带有首字母的圆圈,您可以有一个顶视图 - 未选择状态 - 和一个底视图 - 选定状态。然后,您可以看到一个圆形的可移动视图,该视图跟踪该点的尖端。当该视图与任何外圆相交时,您将创建一个等于该不可见视图的圆角边界的蒙版。

例如:

if CGRectIntersectsRect(self.movableView.frame, self.topView.frame)
        {
            self.topView.layer.mask = nil
            let shapeLayer = CAShapeLayer()
            let rect = self.topView.convertRect(self.movableView.bounds, fromView: self.movableView)
            let path = UIBezierPath(ovalInRect: rect)
            let maskPath = CGPathCreateMutable()
            CGPathAddRect(maskPath, nil, self.view.frame)
            CGPathAddPath(maskPath, nil, path.CGPath)
            shapeLayer.path = maskPath
            shapeLayer.fillRule = kCAFillRuleEvenOdd
            self.topView.layer.mask = shapeLayer
        }

为避免过度命中检测,您应该跟踪当前所选视图,并仅检查与所选视图之前的视图,所选视图以及所选视图后面的视图的交点。如果你感兴趣,我已经创建了一个基本的example掩蔽。