【发布时间】:2018-05-17 13:40:39
【问题描述】:
我一直在修改 LMinh 的这个名为 LMGaugeView 的自定义 UIView,以使其看起来像一个 16 瓶圆形“瓶转盘”。
想象 16 个点 (CGPoints) 均匀分布在圆 (UIView) 的边缘。我希望能够做到以下场景:
图片显示了 10 个小瓶,但你明白了。当我触摸圆形视图时,我希望能够仅根据它们的 CGPoint 值来确定我点击了哪个“小瓶”。
我创建了一个需要 hitTest:withEvent: 方法的应用程序(称为 Twinstones,只是为了把它扔出去),但我正在处理 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 相关的方法来使其工作吗?如果您需要查看更多代码,请告诉我。
【问题讨论】:
-
那么您是否有 16 个独立的单个“小瓶”(如
UIViews)作为子视图嵌入到外部“圆圈”中?如果是这样,为什么不给它们每个都添加一个IBAction,然后直接获取触摸事件? -
我不知道,尽管我认为这可能是要走的路。目前,他们是
CGPoints。我只是想要一种方法来在数学上确定与已知点位置相比的“命中点”(例如,如果小瓶 5 的 CGPoint 为 X,那么从我的点击手势(属于巨型圆形视图)中读取的 CGPoint 是否匹配X? -
我认为你应该只计算初始点与所有其他16个点之间的距离,然后取最近的一个:stackoverflow.com/questions/6416101/…
标签: ios objective-c uitouch hittest cgpoint