【问题标题】:How to display a UIView when it overlaps another iOS?当 UIView 与另一个 iOS 重叠时如何显示它?
【发布时间】:2016-04-21 21:20:38
【问题描述】:

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

【问题讨论】:

    标签: ios uiview geometry cglayer


    【解决方案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 掩码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多