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

时间:2018-05-17 13:40:39

标签: ios objective-c uitouch hittest cgpoint

我一直在修改LMinh的这个自定义UIView,名为LMGaugeView,以使它看起来像一个16小瓶的圆形“小瓶旋转木马”。

想象一下,16个圆点(CGPoints)均匀地分散在圆形边缘(UIView)周围。我希望能够执行以下方案:

Vial Carousel

图片显示了10个小瓶,但你明白了。一旦我触摸圆圈视图,我希望能够根据他们的CGPoint值单独确定我点击的“小瓶”。

我创建了一个应用程序(称为Twinstones,只是为了抛出那个),需要hitTest:withEvent:方法,但我正在处理2个可以触摸的子视图(在他们的超级视图的框架内)。

为此,圆圈是唯一的视图(这意味着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 个答案:

答案 0 :(得分:0)

毕达哥拉斯定理在这里很有用。您可以获得用户触摸屏幕的点,然后使用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]