将 UIGesture 转发到后面的视图

2024-02-19

我正在开发 iPhone(iOS 4.0 或更高版本)应用程序,并且在多个视图之间进行触摸处理时遇到一些问题。我有这样的视图结构

---> A superView 
     |
     ---> SubView - A 
     |
     ---> SubView - B (exactly on top of A, completely blocking A).

基本上我有一个超级视图,以及同级子视图 A 和 B。B 与 A 具有相同的框架,因此完全隐藏 A。

现在我的要求是这样的。

  1. 子视图 B 应接收所有滑动和点击(单次和双次) 手势。
  2. 子视图 A 应该接收所有捏合手势。

这就是我向视图添加手势识别器的方法

UISwipeGestureRecognizer *leftSwipe  =  [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(leftSwipe:)];
[leftSwipe setDirection:(UISwipeGestureRecognizerDirectionLeft)];
leftSwipe.delegate  =   self;
[bView addGestureRecognizer:leftSwipe];
[leftSwipe release];

UISwipeGestureRecognizer *rightSwipe  =  [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(rightSwipe:)];
[rightSwipe setDirection:(UISwipeGestureRecognizerDirectionRight)];
rightSwipe.delegate   =   self;
[bView addGestureRecognizer:rightSwipe];
[rightSwipe release];

UIPinchGestureRecognizer *pinch   =  [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinch:)];
pinch.delegate    =   self;
[aView addGestureRecognizer:pinch];
[pinch release];

我做了一些研究,对我来说UIGestureRecognizerDelegate看起来很有希望,我实现了委托方法

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

我为子视图 B 返回了“否”,希望底层视图能够获取这些事件。但没有这样的运气

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
    if ([gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]] && [gestureRecognizer view] == bView) {
        NSLog(@"pinchGesture");
        //bView.userInteractionEnabled = NO;
        return NO;
    }
    return YES;
}

然后,当识别捏合手势时,我在委托回调内禁用了子视图 B 的用户交互(上面块中的注释代码),希望子视图 A 能够接收到手势的剩余部分。也没有这样的运气。

这就是我现在的立场。我见过this https://stackoverflow.com/questions/6175255/uigesturerecognizer-receive-touch-but-forward-it-to-uicontrol-as-well问题,其中接受的答案涉及财产cancelsTouchesInView。但我相信cancelsTouchesInView只取消特定的触摸事件,不转发它。

还有其他方法可以达到我的要求吗?我已准备好根据您提供的任何提示进行工作。

编辑:赏金时间

我所谓的 subView A 实际上是第 3 方库的 View 类的实例,它取消了所有触摸,并且我无法控制其上的任何手势。我想要左右滑动的不同实现,并且我想要捏合、点击等工作,就像使用第三方视图一样。所以我在 A 之上放置了一个视图(子视图 B)以实现左右滑动。但现在我想将其他手势事件转发到底层库。


如果我正确理解您的问题,您可以添加另一个带有矩形的清晰视图,与您的 A 和 B 视图相同,并在其上实现所有手势:当您执行捏合手势时,控制子视图 A,当滑动和点击时(单次和点击)双)手势 - 控制子视图 B。您可以通过不同的方式做到这一点:通过指针或仅将收到的手势发送到类中的方法,该方法控制您的子视图。

例如:

UISwipeGestureRecognizer *leftSwipe  =  [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(leftSwipe:)];
[leftSwipe setDirection:(UISwipeGestureRecognizerDirectionLeft)];
leftSwipe.delegate  =   subViewAcontroller;
[clearView addGestureRecognizer:leftSwipe];
[leftSwipe release];

UISwipeGestureRecognizer *rightSwipe  =  [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(rightSwipe:)];
[rightSwipe setDirection:(UISwipeGestureRecognizerDirectionRight)];
rightSwipe.delegate   =   subViewAcontroller;
[clearView addGestureRecognizer:rightSwipe];
[rightSwipe release];

UIPinchGestureRecognizer *pinch   =  [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinch:)];
pinch.delegate    =   subViewBcontroller;
[clearView addGestureRecognizer:pinch];
[pinch release];

or:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
    if ([gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]]) {
        NSLog(@"pinchGesture");
        [subViewBcontroller solvePinchGesture: gestureRecognizer];
    }
//etc
    return YES;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 UIGesture 转发到后面的视图 的相关文章

  • 使用仪器分配时 iOS 应用程序冻结

    当我想使用 Instruments Allocation 来分析应用程序的内存使用情况时 它在启动后立即冻结 它总是停留在启动屏幕 这是一个 Xamarin forms 应用程序 这是屏幕截图 其他信息 如果我创建一个新项目 然后使用 In
  • 如何更改 iOS 5 中 UITabBarItem 中文本的颜色

    iOS 5 中有更多外观控制 我们如何更改 UITabBarItem 文本颜色 从默认白色变为其他颜色 编辑 工作解决方案 UITabBarItem appearance setTitleTextAttributes NSDictionar
  • 快速以编程方式打开 viewController

    我想通过代码在按钮上打开新的 UIViewController 我已经在故事板中制作了控制器 只想链接它 而且我不想使用 XIB 接口或 nibName 要打开新视图控制器 您需要在按钮单击事件中写入以下行 self performSegu
  • 应用程序关闭时下载报刊亭应用程序

    我正在实现一个报摊杂志应用程序 它通过 Urban Airship 推送通知接收新期刊 只要应用程序位于前台或后台 这就可以正常工作 但据我所知 当应用程序完全关闭时也应该触发下载 但发送推送 content available 1如果我的
  • iPhone en_* 子语言本地化

    我想在我的 iphone 应用程序中将字符串本地化为 en GB 和其他 en 子语言 但 XCode 和 iphone 拒绝让这种情况发生 我已经为 en GB 和 en US 创建了 Localized strings 的本地化 我尝试
  • 如何正确设置UIView的alpha? [iOS]

    I have UIView有很多子视图 UILabel UITextView 等 如果为主视图设置 alpha 0 6 则所有子视图均采用此 alpha 如何单独设置主视图的alpha view setBackgroundColor UIC
  • [UITableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:]

    我正在使用表格视图来显示消息 我使用了下面的代码 UIView chatView self bubbleView NSString stringWithFormat message from YES self chatArray addOb
  • iOS 9.3.2 破坏 MPMusicPlayerController

    我正在尝试将 Apple Music 集成到我的应用程序中 直到今天早上我才设法使其完美运行 更新到 iOS 9 3 2 后 一切都不一样了 权限系统的工作原理相同 SK云服务控制器 https developer apple com li
  • 有没有相当于 mkmapsnapshotter 的 Google 地图?

    我有一个UITableView其中可能包含大量单元格 并且在某些单元格中我想要一个UIImageView显示一个位置的地图 其坐标仅在运行时已知 我希望表格视图能够平滑滚动 并且我希望单元格中的地图根本不可滚动 我被指示避开苹果地图 除了
  • 如何在 iPhone 中使用彩信发送音频?

    我瞪大了眼睛MMS在 iPhone 中 但我没有找到太多这方面的信息 大多数发现都与图像有关 我想使用发送音频MMS in iPhone using ios sdk 可以这样做吗 我有以下疑问MMS 如何识别所有MMS音频文件在iPhone
  • Objective-C 内存管理:发布时崩溃

    我是 Objective C 的新手 似乎无法正确理解内存管理代码 我有以下代码 Media myMedia self myMediaManager getNextMedia self navigationItem title self m
  • WKWebView 中的调整大小处理程序中的 window.innerWidth/Height 未更新

    我有一些全屏网页内容 当窗口使用调整大小事件更改大小时 我会更新这些内容 window onresize function var width window innerWidth var height window innerHeight
  • 当我使用prepareForSegue将值传递给目标控制器时,存在一些问题

    首先 我使用storyboard创建两个uiviewcontroller 第一视图控制器 and 第二个视图控制器 并使用 xcode 嵌入导航控制器 into 第二个视图控制器 编辑器 gt 嵌入 gt 导航控制器 然后 我还想使用 se
  • 无法为 FacebookSDK 4 构建模块“FBSDKCoreKit”

    我在将 Facebook SDK 3 更新到 4 时遇到问题 当我添加框架时 它已成功添加 但是当我添加头文件时出现错误 无法构建模块 FBSDKCoreKit 不知道原因 在设置中 允许非模块化包含在框架模块中 设置为YES在构建设置中解
  • UITableView 在单元格刷新时滚动到顶部

    我有一个 UITableView 其中一个单元格的大小是动态调整的 以适应其中的 UITextView 每当键入一个键时 单元格都会检查计算出的高度是否增加 就像换行符一样 因此它可以告诉表单元格的高度需要重新计算 我用这段代码做到了这一点
  • 如何处理 iPhone 6S Plus 字体大小?

    与其他屏幕尺寸相比 iPhone 6S Plus 的屏幕非常大 我似乎无法找到一种在不以编程方式调整大小的情况下处理标签字体大小的好方法 如何调整标签的字体大小 使其在 iPhone 5 上看起来更小 在 iPhone 6 Plus 上看起
  • 带有 Retina-Tiles 的 MKTileOverlay

    我在 MKMapKit 中加载 512x512px 图块时遇到问题 服务器提供 512x512 jpeg 图块 我在 MKMapView 中找不到自定义视网膜图块的任何解决方案或示例实现 我做什么 当我将它们加载到 MKMapView 中时
  • 如何在 SceneKit 中以编程方式将 png 纹理包裹在立方体周围

    我是 SceneKit 的新手 试图让一些基本的东西工作 但到目前为止还没有取得多大成功 由于某种原因 当我尝试将 png 纹理应用于 CNBox 时 我最终除了黑色之外什么也没有 这是我在 viewDidLoad 中的简单代码片段 let
  • TestFlight Beta 中的消息不可用

    I am seeing Unavailable message in TestFLight Beta App in iOS8 Please find the attached screenshot please tell me how to
  • 如何从TableViewCell上的自定义CollectionViewCell推送VC?

    我有一个tableView和细胞 在细胞上我有一个collectionView并在其上显示一些内容 我想发送一个有关选择的链接indexPath 我想从自定义中推送 呈现我的视图CollectionViewCell这是在TableViewC

随机推荐

  • C# 正则表达式匹配方括号

    我尝试在 C 中使用正则表达式来匹配可以包含以下内容的软件版本号 2 位数字 1 或 2 位数字 不以 0 开头 另一个 1 或 2 位数字 不以 0 开头 1 2 3 4 或 5 位数字 不以 0 开头 末尾有一个选项字母 括在方括号中
  • 将设计身份验证合并到现有的用户结构中?

    我有一个功能齐全的身份验证系统 其中的用户表有超过五十列 它很简单 但它使用盐进行哈希加密 使用电子邮件而不是用户名 并且还有两种不同类型的用户和管理员 我希望将 Devise 身份验证合并到我的应用程序中 以增强额外的部分 例如电子邮件验
  • gcc 如何在特定平台上获得每种类型的对齐方式?

    它是硬编码到 gcc 的源代码中还是以编程方式获取 我认为它是硬编码在特定于 arch 的文件夹中的 例如对于sparc http www google com codesearch Yj7Hz1ZInUg trunk gcc 4 2 1
  • C:修改文件以从外部文件读取

    我正在努力通过C 编程语言 第二版 尝试通过例子进行推理 我对 C 是个新手 第一章中的大部分示例代码依赖于getchar 接收输入 例如 以下代码返回文本块的最长行 include
  • 我将如何实现不同速度的秒表?

    理想情况下 我想要类似的东西跑表 http msdn microsoft com en us library system diagnostics stopwatch aspx类 但有一个额外的属性称为Speed这将决定计时器改变分钟的速度
  • 为什么flask sqlalchemy模型查询没有得到最新记录?

    我有一个模型类 class PlatformUsage db Model tablename platform usage id db Column db BigInteger primary key True module db Colu
  • div内的表格溢出

    我有一个非常基本的 CSS 问题 我有一个高度固定的 div 并且该 div 内有一个表格 除非 div 具有滚动条 否则表格的内容将无法容纳在 div 中 现在的问题是 表格的内容溢出了 div 因为它的高度超过了我在 div 上设置的高
  • Jenkins 中的 pipelinev shell 返回问题 termios.error: (25, 'In合适的 ioctl for device')

    我的 Jenkins 有一个问题 当我运行作业时 Jenkins 遵循以下步骤 1 pipenv install r requirements txt 2 pipenv shell 在这一步出现了这个错误 pipenv shell 17 2
  • json_encode() 中的编码

    包含 或其他特殊字符的字符串怎么会返回 null 不仅保留特殊字符 而且整个字符串 值 都返回为 null EDIT class JSON static function encode arr utf8 encode false arr s
  • 获取 href onclick 并使用链接重定向

    我正在尝试执行以下代码 通过单击特定的 a 标签从一个页面重定向到另一页面 并附加 clk 变量中的特定链接 function abc var a document getElementsByTagName a alert a for va
  • AndEngine:处理与 TMX 对象的碰撞

    我现在设法加载 tmx 地图 我想创建精灵无法移动的障碍 我像这样恢复了障碍 try final TMXLoader tmxLoader new TMXLoader this this mEngine getTextureManager T
  • JSON 模式 oneOf 属性已填充

    如何设置 JSON 架构规则来表明必须设置并且是必需的属性之一 我尝试了各种方法来解决它 例如 id required true additionalProperties true type object properties surnam
  • 使用 MediaMuxer 创建的不可流式传输的视频文件

    我在用MediaCodec对视频进行编码 帧通过相机预览回调传入MediaCodec实例 未使用 Surface 我在用JCodec https github com jcodec jcodec用于混合的库 我能够流式传输生成的视频 视频播
  • C# 中“枚举数”的定义

    C 中枚举数的含义是什么 枚举器可帮助您枚举 迭代 项目集合 您只需查看即可推断出目的IEnumerator 接口的成员 https msdn microsoft com en us library 78dfe2yb aspx 更具体地说
  • 在 zxing 片段库中打开/关闭手电筒

    我在我的应用程序中实现了 Zxing 条码扫描库 我使用过以下库 https code google com p barcodefraglibv2 https code google com p barcodefraglibv2 我想在扫描
  • 从放置在列表视图中的 edittext 获取数据

    我使用 Holder 创建了一个包含 textview 和 edittext 的列表 它看起来像 Textview Edittext Textview Edittext Textview Edittext 但我无法从每个 Edittext
  • 是否可以使用 Ruby 将一系列 PDF 合并为一个?

    我有一系列按顺序命名的 PDF 如下所示 01 foo pdf 02 bar pdf 03 baz pdf etc 使用 Ruby 是否可以将它们组合成一个大的 PDF 同时保持它们的顺序 我不介意安装任何必要的宝石来完成这项工作 如果这在
  • 从 URL 获取文件名

    在Java中 给定一个java net URL or a String形式为http www example com some path to a file xml 获取文件名 减去扩展名 的最简单方法是什么 所以 在这个例子中 我正在寻找
  • Rust 比赛的早期突破

    我想切换多种可能的情况x有一种情况 这里x 0 我想检查一些附加代码的结果以确定下一步要做什么 一种可能性是提前结束比赛 I d use break在 C 中执行此提前返回操作 但这在 Rust 中是不允许的 return从父函数返回 在本
  • 将 UIGesture 转发到后面的视图

    我正在开发 iPhone iOS 4 0 或更高版本 应用程序 并且在多个视图之间进行触摸处理时遇到一些问题 我有这样的视图结构 gt A superView gt SubView A gt SubView B exactly on top