1

根据 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 像素大小的小视图。

  1. 假设小视图非常靠近超级视图的边缘,那么这个方法会导致一半的可触摸区域延伸到超级视图之外,而可触摸区域实际上是22 x 44。这种情况下我需要进一步覆盖超级视图的pointInside .

  2. 假设我们有三个彼此非常接近的小视图,那么上视图总是会赢得触摸。理想情况下,我希望最接近接触点的视图获胜。

请问除此之外还有更好或更优雅的解决方案吗?

为了更好地说明我的担忧,让我举个例子:每个人都应该熟悉iOS的Copy Blue Hint Dot(不确定我是否使用了正确的词,但请看图片)。 http://i.stack.imgur.com/FtjYi.png

假设我们要实现它(复制蓝点)。对于那个蓝点,我不知道 Apple 是如何实现的。但是,我假设蓝点是一种 UIImageView,并假设它是一些 UITextView 的子视图(这可能不确定)。UIImageView 可以响应触摸吗?在我的解决方案中,它可以通过覆盖 pointInSide 来响应触摸。在这种情况下,我的两个问题可以翻译为:

  1. 如果我们选中的词离 UITextView 边缘太近怎么办?所以那个蓝点的理想触摸区域甚至可能在超级视图(UITextView)之外。
  2. 如果上蓝点离下蓝点太近,我们从两个点的中间拖动怎么办(看起来下蓝点有更高的获胜机会。)
4

2 回答 2

1

您错过了文档的重点。

出于可用性原因,Apple UI 指南建议您不要将可触摸区域(通常由某种视图、按钮、图像等表示)小于 44X44。(指尖大小)

如果您有一个 5X5 视图,则它不是接收触摸事件的正确视图,您应该使用该视图的超级视图来接收孩子的触摸事件。

(编辑以删除我的错误声明,即这是不可能的)

于 2012-08-09T00:31:42.007 回答
0

你采取了错误的方法,首先你不应该混淆来自 ios 的触摸检测,它已经过预配置和优化,可以在手指触摸时正常工作,这就是为什么如果你触摸你的读数通常会比你实际触摸的地方高一点.

似乎您想做某种“用户在某个地方触摸的位置”,如果我是您,我会得到一个 uiview,例如,这是我的完整可触摸区域,只需在其中添加其余元素,您就可以放它们可以放在任何你想要的地方,它们甚至可以重叠或任何东西,只需确保超级视图是接收触摸的那个并做一些数学运算,看看哪个最接近元素中心。即使它们是按钮,您也可以禁用交互并以编程方式显示它们的状态变化。好像他们被按下或什么的。

重申我的观点。只使用 1 个大的触控区域,然后计算其余部分,这样您就可以完全控制触控区域等。

(然后我可能完全误解了你的目的)

于 2012-08-09T01:07:44.017 回答