当视图移动到超级视图之外时,touchesBegan停止工作

时间:2010-12-12 17:31:36

标签: iphone touch

我正在使用[aSubview touchesBegan]在屏幕上移动aSubview与其超级视图相关的位置。它的超级视图并不比子视图本身大。这很简单,如下面的代码片段所示:

    UITouch* touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:[self superview]];
    self.center = touchPoint;

然而,一旦aSubview移动,只要它的任何部分超出其超视图的范围,该部分中的触摸就不再注册。换句话说,touchesBegan不再开火了。我希望aSubview中的触摸能够注册,无论它与超级视图相关的位置如何。

有什么想法吗? 霍华德

4 个答案:

答案 0 :(得分:5)

mcpunky的答案几乎是好的,除了你可以使pointInside函数始终返回YES。通过这种方式,视图将拦截所有触摸。

相反,需要做更精细的检查:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{

    return CGRectContainsPoint(self.subviewOutsideMe.frame, point) || CGRectContainsPoint(self.bounds, point);

}

答案 1 :(得分:2)

我刚接触到子视图没有收到输入的问题,因为superview根本就没有为超出界限的子视图发送触摸事件。此外,保持超视图的界限至关重要,并且将子视图移动到层次结构中也是不可行的。我的工作是什么超越了superview的

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 

始终返回YES。结果:在superview和subviews中几乎没有任何变化,但输入是在superview边界之外接收的。

答案 2 :(得分:1)

我和一位苹果工程师谈过此事。 touchesBegan将无法在其超级视图中未包含的子视图部分中工作,因为系统在尝试确定调用哪个子视图的touchesBegan时,在层次结构的路上剪切每个子视图。

为了解决这个问题,我删除了导致裁剪问题的中间包装器视图,并将子视图提升了一个级别。这需要对逻辑进行微小的改变,但最终证明这是一个更清洁的解决方案 - 更重要的是,它可以起作用。

答案 3 :(得分:0)

我不确定这是否是正确的方法,但它肯定是单向的。

甚至在父对象中收听touchesBegan。 如果你得到一个事件,请通过自己调用touchesBegan将其传递给childs视图。

相关问题