Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何将触摸从UIView传递到UIScrollView_Iphone_Objective C_Uiview_Uiscrollview - Fatal编程技术网

Iphone 如何将触摸从UIView传递到UIScrollView

Iphone 如何将触摸从UIView传递到UIScrollView,iphone,objective-c,uiview,uiscrollview,Iphone,Objective C,Uiview,Uiscrollview,和其他许多类似,我有一个带有NIB文件的视图控制器,它有这样的布局 a。UIView(480 x 320)-存储背景图像 b。UIScrollView(480 x 220)-是一个级别选择器滚动视图 c。UIView(480 x 320)-包含前景动画图形 以上三项都是NIB中主视图的子视图。UIView(c)是iPhone屏幕的全尺寸,位于层次结构的顶部。在它上面,我放置了一个角色,它根据视图中的当前触摸位置设置动画。然而问题是,当这个视图接收到触摸时,我无法触摸它下面的滚动视图(b)。我

和其他许多类似,我有一个带有NIB文件的视图控制器,它有这样的布局

  • a。UIView(480 x 320)-存储背景图像
  • b。UIScrollView(480 x 220)-是一个级别选择器滚动视图
  • c。UIView(480 x 320)-包含前景动画图形
以上三项都是NIB中主视图的子视图。UIView(c)是iPhone屏幕的全尺寸,位于层次结构的顶部。在它上面,我放置了一个角色,它根据视图中的当前触摸位置设置动画。然而问题是,当这个视图接收到触摸时,我无法触摸它下面的滚动视图(b)。我仍然需要使用(c)处的触摸,但之后还需要将相关触摸/滑动传递到下面的UIScrollView

有人能建议如何做到这一点吗?我读过关于使用hittest的各种帖子,但不想完全抵消触摸,我只需要在之后转发它们,这样scrollview仍然可以正常工作


谢谢,

如果是我,我会将scrollView设置为top view的代理。当然,这需要俯视图是
UIView
的自定义子类,因此您可以设置

id delegate; 

在头文件中。然后将scrollView设置为具有以下内容的委托:

[topView setDelegate:scrollView];
有了它,您就可以在必要时向scrollView发送消息(在您的情况下是触摸事件)。例如,如果您希望发送所有TouchStart事件,您将有:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.delegate touchesBegan:touches withEvent:event];
}

当然,如果您只希望传递某些事件,您可以在方法中设置参数,说明何时调用
[self.delegate..]
[super..]
。后者将为视图而不是在scrollView中执行操作。我希望这有助于

将UIScrollView子类化并覆盖ToucheShouldCancelIncontentView:方法,如下所示:

-(BOOL)touchesShouldCancelInContentView:(UIView *)view
{

    if ([view isKindOfClass:[UIButton class]]) {//or whatever class you want to override
        return YES;
    }

    if ([view isKindOfClass:[UIControl class]]) {
        return NO;
    }

    return YES;
}

以下是一个对我很有效的简单解决方案:

在视图C(UIScrollView上方的前景视图)中,将宽度和高度都设置为0(这样视图从技术上讲不再位于scrollview的顶部),并设置clipsToBounds=no(这样视图C的内容仍然显示在scrollview的顶部)。这对我来说很有魅力

 self.viewC.clipsToBounds = NO;
 CGRect frame = self.viewC.frame;
 self.viewC.frame = CGRectMake(frame.origin.x, frame.origin.y, 0, 0);

请注意,如果视图C包含交互式控件,则它们将不再工作

问题是,在scrollview中没有检测到滑动-我在到达现在的“状态”之前尝试过这种方法。英雄联盟这是一个国家!但是,您确实让我想到了传递动画所需的信息,但没有触摸事件。我会调查的!哈哈,我很清楚那种感觉。但我很高兴这让你想到了解决这个问题的新方法。对于这样的问题,这通常是我的默认设置。基本上,只需设置将事件发送给代理并从那里开始的条件,无论是手势、触摸还是其他方式。如果您需要更多的控制,您可以将scrollView子类化,并从俯视图中采用自定义协议,指定要调用哪些方法以及如何实现它们。我希望这不会让人困惑,但如果你想尝试一下,我会非常乐意帮助你。是的,这当然是一个设计问题——我总是知道当我以一种愚蠢的方式做某事时,因为它“感觉”像是糟糕的编程!谢谢你的建议,没问题。我总是很乐意帮忙。我希望你能很快把一切都安排好。试着添加以下内容:[super touchesbeated:toucheevent:event];还要注意,如果您要覆盖其中一种触摸处理方法,则需要覆盖所有四种:touchsbegind、touchsmoved、touchseended和touchscancelled。非常聪明。帮助我解决了一些问题。如果origin为0,则可以使用CGRectZero,更干净。难道您不能将.userInteractionEnabled改为NO/false吗?可能是因为视图C不是scrollview的子视图,因此不会包含在
ToucheShouldCancelIncontentView
测试中。(我猜这就是为什么有人投票否决了你)
 self.viewC.clipsToBounds = NO;
 CGRect frame = self.viewC.frame;
 self.viewC.frame = CGRectMake(frame.origin.x, frame.origin.y, 0, 0);