命中测试以确定哪个 CGPoint 最接近触摸 - 1 个 UIView 中的 16 个 CGPoint 点
Hit Test to determine which CGPoint was closest to touch - 16 CGPoint dots in 1 UIView
我一直在通过 LMinh 修改这个名为 LMGaugeView 的自定义 UIView,以使其看起来像一个 16 瓶圆形 "vial carousel"。
想象一下,16 个点 (CGPoints) 均匀分布在圆 (UIView) 的边缘。我希望能够执行以下场景:
图片显示了 10 个小瓶,但您明白了。一旦我触摸圆形视图,我希望能够仅根据它们的 CGPoint 值来确定我点击了哪个 "vial"。
我创建了一个需要 hitTest:withEvent:
方法的应用程序(称为 Twinstones,只是为了把它扔在那里),但我正在处理 2 个可以触摸的子视图(在它们的父视图的框架内。)
为此,圆圈是唯一的视图(这意味着 hitTest:withEvent:
每次我接触它时只会 return 圆圈视图。)
这是 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 相关的方法来让它工作吗?如果您需要查看更多代码,请告诉我。
毕达哥拉斯定理在这里很有用。您可以获得用户触摸屏幕的位置,然后使用 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]
我一直在通过 LMinh 修改这个名为 LMGaugeView 的自定义 UIView,以使其看起来像一个 16 瓶圆形 "vial carousel"。
想象一下,16 个点 (CGPoints) 均匀分布在圆 (UIView) 的边缘。我希望能够执行以下场景:
图片显示了 10 个小瓶,但您明白了。一旦我触摸圆形视图,我希望能够仅根据它们的 CGPoint 值来确定我点击了哪个 "vial"。
我创建了一个需要 hitTest:withEvent:
方法的应用程序(称为 Twinstones,只是为了把它扔在那里),但我正在处理 2 个可以触摸的子视图(在它们的父视图的框架内。)
为此,圆圈是唯一的视图(这意味着 hitTest:withEvent:
每次我接触它时只会 return 圆圈视图。)
这是 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 相关的方法来让它工作吗?如果您需要查看更多代码,请告诉我。
毕达哥拉斯定理在这里很有用。您可以获得用户触摸屏幕的位置,然后使用 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]