Ios 处理触摸从主视图开始-如何获得触摸子视图?
在单视图iPhone应用程序中,我有以下结构:Ios 处理触摸从主视图开始-如何获得触摸子视图?,ios,iphone,uiscrollview,hittest,touchesbegan,Ios,Iphone,Uiscrollview,Hittest,Touchesbegan,在单视图iPhone应用程序中,我有以下结构:scrollView->contentView->imageView,下面(在主视图中)有7个可拖动的自定义视图-可以从contenView拖动 最初,拖动是在自定义视图中处理的(请参见),虽然这很有效,但需要向主视图发送通知 因此,我尝试将触摸开始和好友移动到主应用程序视图(请参阅) 我的问题是: 最初,我在contentView(请参阅)中有此代码,以便在滚动视图中启用子视图拖动: - (UIView *)hitTest:(CGPoint)poi
scrollView->contentView->imageView
,下面(在主视图中)有7个可拖动的自定义视图-可以从contenView
拖动
最初,拖动是在自定义视图中处理的(请参见),虽然这很有效,但需要向主视图发送通知
因此,我尝试将触摸开始
和好友移动到主应用程序视图(请参阅)
我的问题是:
最初,我在contentView
(请参阅)中有此代码,以便在滚动视图中启用子视图拖动:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView* result = [super hitTest:point withEvent:event];
return result == self ? nil : result;
}
但是,当尝试将互动程序从contentView
拖回主视图时(按下面屏幕截图所示的方向),这不会将touchsbegind
拖回主视图
因此,我更改了此方法以返回主视图而不是平铺:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView* result = [super hitTest:point withEvent:event];
return result == self ? nil : self.window.rootViewController.view;
}
现在在主视图上调用了touchesbreated
(我可以在调试器中看到),但是touches.view
也指向主视图
我的问题是:
如何在新的touchesbreated
方法中找到被触摸的磁贴?不管怎样,我已经解决了我的问题
在中,我添加了一个\u draggedTile
ivar,并使用以下方法在touchsbegind
中设置它,以查找被触摸的互动程序:
- (SmallTile*) findTileAtPoint:(CGPoint)point withEvent:(UIEvent*)event
{
NSArray* children = [self.view.subviews arrayByAddingObjectsFromArray:_contentView.subviews];
for (UIView* child in children) {
CGPoint localPoint = [child convertPoint:point fromView:self.view];
if ([child isKindOfClass:[SmallTile class]] &&
[child pointInside:localPoint withEvent:event]) {
return (SmallTile*)child;
}
}
return nil;
}
在touchedMoved
,toucheseEnd
,touchesCancelled
中,我只使用了那个ivar(最初我使用的是上面的findTileAtPoint:withEvent:
方法,但有时触摸不会完全覆盖到拖动的磁贴上,移动会突然或取消)