根据 Apple 的文档,任何可触摸视图至少应具有 44 x 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 x 44。这种情况下我需要进一步覆盖超级视图的pointInside .
假设我们有三个彼此非常接近的小视图,那么上视图总是会赢得触摸。理想情况下,我希望最接近接触点的视图获胜。
请问除此之外还有更好或更优雅的解决方案吗?
为了更好地说明我的担忧,让我举个例子:每个人都应该熟悉iOS的Copy Blue Hint Dot(不确定我是否使用了正确的词,但请看图片)。 http://i.stack.imgur.com/FtjYi.png
假设我们要实现它(复制蓝点)。对于那个蓝点,我不知道 Apple 是如何实现的。但是,我假设蓝点是一种 UIImageView,并假设它是一些 UITextView 的子视图(这可能不确定)。UIImageView 可以响应触摸吗?在我的解决方案中,它可以通过覆盖 pointInSide 来响应触摸。在这种情况下,我的两个问题可以翻译为:
- 如果我们选中的词离 UITextView 边缘太近怎么办?所以那个蓝点的理想触摸区域甚至可能在超级视图(UITextView)之外。
- 如果上蓝点离下蓝点太近,我们从两个点的中间拖动怎么办(看起来下蓝点有更高的获胜机会。)