我正在使用[aSubview touchesBegan]
在屏幕上移动aSubview
与其超级视图相关的位置。它的超级视图并不比子视图本身大。这很简单,如下面的代码片段所示:
UITouch* touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:[self superview]];
self.center = touchPoint;
然而,一旦aSubview
移动,只要它的任何部分超出其超视图的范围,该部分中的触摸就不再注册。换句话说,touchesBegan
不再开火了。我希望aSubview
中的触摸能够注册,无论它与超级视图相关的位置如何。
有什么想法吗? 霍华德
答案 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视图。