代码之家  ›  专栏  ›  技术社区  ›  Anthony_b

点击测试以确定哪个CGPoint最接近触摸-1 UIView中有16个CGPoint点

  •  1
  • Anthony_b  · 技术社区  · 6 年前

    我一直在修改LMinh名为LMGaugeView的自定义UIView,以使其看起来像一个16瓶的圆形“瓶转盘”。

    想象16个点(CGPoints)均匀分布在圆的边缘(UIView)。我希望能够执行以下场景:

    Vial Carousel

    图中显示了10瓶,但你明白了。只要我触摸到圆形视图,我就希望能够根据它们的CGPoint值来确定我点击了哪个“小瓶”。

    我创建了一个需要 hitTest:withEvent: 方法,但我正在处理两个可以触摸的子视图(在其superview的框架内)

    因此,圆圈是唯一的视图(这意味着 hitTest:withEvent: 每次我接触圆视图时,它只会返回圆视图。)

    这就是 hitTest:... 实施:

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
        if (!self.isUserInteractionEnabled || self.isHidden || self.alpha <= 0.01) {
            return nil;
        }
    
        CGRect touchRect = CGRectInset(self.bounds, -14, -14);
        if (CGRectContainsPoint(touchRect, point)) {
           for (UIView *subview in [self.subviews reverseObjectEnumerator]) {
                CGPoint convertedPoint = [subview convertPoint:point fromView:self];
                UIView *hitTestView = [subview hitTest:convertedPoint withEvent:event];
                if (hitTestView) {
                    return hitTestView;
                }
            }
            return self;
        }
        return nil;
    }
    

    我是否需要使用其他与hitTest相关的方法来实现这一点?如果您需要查看更多代码,请告诉我。

    1 回复  |  直到 6 年前
        1
  •  0
  •   kevin    6 年前

    毕达哥拉斯定理在这里很有用。您可以获得用户触摸屏幕的点,然后使用map()计算到每个小瓶的距离,并找到最小值:

    let p1 = //where your user touched the view
    let vialDistances = vials.map { // your vials array
        let p2 = // vial position
        let diffX = p1.x - p2.x
        let diffY = p1.y - p2.y
        return diffX * diffX + diffY * diffY
    }
    let index = find(vialDistances, vialDistances.min())
    let closestVial = vials[index]