根据Apple的文档,任何可触摸的视图至少应该有44点44分的可触摸区域。
我做了一些调查,看起来像一个很好的解决方案是覆盖pointInside如下:
- (BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
CGRect l_bounds = self.bounds;
float lengthOf44 = [self convertLengthFromScreen:44];
CGFloat l_widthDelta = lengthOf44 - l_bounds.size.width;
CGFloat l_heightDelta = lengthOf44 - l_bounds.size.height;
if (l_widthDelta < 0)
{
l_widthDelta = 0;
}
if (l_heightDelta < 0)
{
l_heightDelta = 0;
}
l_bounds = CGRectInset(l_bounds, -0.5 * l_widthDelta, -0.5 * l_heightDelta);
if (CGRectContainsPoint(l_bounds, point))
{
return YES;
}
return NO;
}
然而,这个解决方案有很多缺点。给定一个5 x 5像素大小的小视图。
假设小视图非常接近超视图的边缘,那么此方法将导致超视图外部的延伸可触摸区域的一半,并且可触摸区域实际上是22乘44。在这种情况下我需要进一步覆盖superview的pointInside。
假设我们有三个彼此非常接近的小视图,那么上方视图将始终赢得触摸。 理想情况下,我希望最接近触点的视图获胜。
除此之外,还有更好或更优雅的解决方案吗?
为了更好地说明我的担忧,让我举一个例子:每个人都应该熟悉iOS的Copy Blue Hint Dot(不确定我是否使用了正确的单词,但请看图像)。 http://i.stack.imgur.com/FtjYi.png
假设我们要实现它(复制蓝点)。对于那个蓝点,我不知道Apple是如何实现的。但是,我认为蓝点是一种UIImageView,并假设它是某些UITextView的子视图(这可能不确定)。 UIImageView可以响应触摸吗?在我的解决方案中,它可以通过覆盖pointInSide来响应触摸。 在这种情况下,我的两个问题可以翻译为:
答案 0 :(得分:1)
你错过了文档的重点。
Apple UI指南建议您出于可用性原因,不要将可触摸区域(通常由某种视图,按钮,图像等表示)小于44X44。 (指尖的大小)
如果你有一个5X5的视图,它不是接收触摸事件的正确视图,你应该使用该视图的超级视图来接收孩子的触摸事件。
(编辑以删除我不正确的声明,这是不可能的)
答案 1 :(得分:0)
你正在采取错误的方法,首先你不应该从ios中弄乱触摸检测,它是预先配置和优化的,以便用手指触摸正常工作,这就是为什么如果你触摸你通常得到的读数比那里高一点你真的感动了。
似乎你想做某种“用户在一个地方触摸的地方”,如果我是你,我会得到一个uiview例如这是我完全可触摸的区域,只是在那里添加其余的元素,你可以把它们放在任何你想要的地方,它们甚至可以重叠或任何东西,只要确保superview是接收触摸的那个,并做一些数学运算来看哪一个最接近元素中心。即使它们是按钮,您也可以禁用交互并以编程方式显示其状态更改。好像他们被按下了什么。
重申我的观点。只需使用一个大触摸区域并对其余部分进行数学运算,这样您就可以完全控制触摸区域等。
(然后我可能会完全误解你的目的)