我有一个响应触摸的大UIView,并且它覆盖了许多对触摸有不同反应的小UIViews。是否可以触摸屏幕上的任何位置并滑动,并让每个视图知道它是否被触摸?
例如,我将手指放在左上方并向右下方滑动。 touchesBegan / Moved由baseView收集。当我传递itemView1,itemView2和itemView3时,控件传递给它们。如果我在itemView2上抬起手指,它会执行itemView2的touchesEnded方法。如果我将手指抬到任何一个项目上,它就会执行baseView的touchesEnded。
目前,如果我触及baseView,touchEnded始终是baseView,而忽略更高的itemViews。
有什么想法吗?
答案 0 :(得分:1)
如果我理解正确,会检测到touchesEnded事件 ,但不会被需要了解它的子视图检测到。我认为这可能适合你:
在一个公共文件中,将TOUCHES_ENDED_IN_SUPERVIEW定义为@“触摸在superview中结束”。
在 触发的包含视图的touchesEnded方法中,添加
[[NSNotificationCenter defaultCenter] postNotificationName: TOUCHES_ENDED_IN_SUPERVIEW object: self];
在子视图的touchesBegan中,添加
[[NSNotificationCenter defaultCenter] addObserver: self
selector: @selector(touchesEnded:)
name: TOUCHES_ENDED_IN_SUPERVIEW
object: self.superview];
在子视图的touchesEnded方法中,使用正常的事件逻辑,并添加
[[NSNotificationCenter defaultCenter] removeObserver: self name: TOUCHES_ENDED_IN_SUPERVIEW object: self.superview];
请记住在您的dealloc中放置[[NSNotificationCenter defaultCenter] removeObserver:self],以防止在没有获取touchesEnded事件的情况下离开页面。
您可能希望通知将其消息发送到特殊的touchesEndedInSuperview方法,该方法将调用touchesEnded本身,但这取决于您是否有任何特殊处理要做。
答案 1 :(得分:0)
您可以使用以下内容:
-(void)touchesEnded: (NSSet *)touches
withEvent: (UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView: touch.view];
if (CGRectContainsPoint(control1.frame, location)) {
[self control1Action];
} else if (CGRectContainsPoint(control2.frame, location)) {
[self control2Action];
}
}