【发布时间】:2012-08-09 00:27:47
【问题描述】:
根据 Apple 的 Document,任何可触摸视图至少应具有 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×44。在那种情况下我需要进一步覆盖superview的pointInside。
假设我们有三个小视图,它们彼此非常接近,那么上视图总是会赢得触摸。 理想情况下,我希望最接近接触点的视图获胜。
请问还有比这更好或更优雅的解决方案吗?
为了更好地说明我的担忧,让我举个例子:每个人都应该熟悉 iOS 的 Copy Blue Hint Dot(不确定我是否使用了正确的词,但请看图片)。 http://i.stack.imgur.com/FtjYi.png
假设我们要实现它(复制蓝点)。对于那个蓝点,我不知道 Apple 是如何实现的。但是,我假设蓝点是一种 UIImageView,并假设它是一些 UITextView 的子视图(这可能不确定)。 UIImageView 可以响应触摸吗?在我的解决方案中,它可以通过覆盖 pointInSide 来响应触摸。 在这种情况下,我的两个问题可以翻译为:
- 如果我们选中的单词离UITextView边缘太近怎么办?因此,该蓝点的理想触摸区域甚至可能位于超级视图 (UITextView) 之外。
- 如果上蓝点距离下蓝点太近,我们从两个点的中间拖动怎么办(看起来下蓝点获胜的机会更高。)
【问题讨论】:
-
这不是一个好的解决方案。这就是您发布问题的原因。
-
同意这不是一个好的解决方案。这就是为什么我正在寻求更好的解决方案。尤其是问题 1。
-
您得到的答案是在超级视图中触摸的答案句柄,并通过命中测试映射回您的子视图。
-
如果触摸超出了superview,superview无法接收到触摸怎么办?
-
处理最顶部视图的触摸并向下映射。
标签: objective-c ios cocoa-touch