面向幼儿的AVPlayer应用:如何禁用拖拽关闭功能?(Objective-C)
解决iOS系统更新后AVPlayer拖拽关闭误触的问题
嘿,这个场景太贴合幼儿应用的痛点了!我之前帮做早教APP的朋友处理过类似问题,给你分享两个靠谱的Objective-C解决方案:
1. 如果你用的是AVPlayerViewController(官方播放器控制器)
iOS 13及以后的系统给AVPlayerViewController加了一个专门控制拖拽关闭的属性:allowsInteractiveDismissal,直接把它设为NO就能禁用拖拽关闭功能,完美适配你的需求。
代码示例:
AVPlayerViewController *playerVC = [[AVPlayerViewController alloc] init]; playerVC.player = yourAVPlayerInstance; // 禁用交互式拖拽关闭 if (@available(iOS 13.0, *)) { playerVC.allowsInteractiveDismissal = NO; } // 将播放器控制器present或push到界面 [self presentViewController:playerVC animated:YES completion:nil];
加版本判断是为了兼容更低版本的iOS系统,避免编译或运行时出错。
2. 如果你用的是自定义播放器视图(自己封装的播放容器)
如果是你自己写的播放器界面,没有用AVPlayerViewController,可以通过以下两种方式拦截系统的拖拽关闭手势:
- 方式一:重写视图控制器的dismiss方法
在播放器所在的ViewController里,重写dismissViewControllerAnimated:completion:方法,按需阻止dismiss操作:
- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion { // 可以添加判断逻辑,比如只有手动触发的关闭指令才允许执行 // 若不需要保留手动关闭,直接return就能阻止系统拖拽关闭 // if (!_isManualDismissTriggered) { return; } [super dismissViewControllerAnimated:flag completion:completion]; }
- 方式二:添加全屏手势识别器拦截触摸
给播放器的父视图添加一个全屏手势,设置更高优先级,让幼儿的误触先被你的手势拦截,不会触发系统的拖拽关闭:
UITapGestureRecognizer *blockGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleBlockGesture:)]; // 不阻止其他视图的触摸响应,同时确保优先级高于系统手势 blockGesture.cancelsTouchesInView = NO; blockGesture.delegate = self; [self.view addGestureRecognizer:blockGesture]; // 实现手势代理方法,确保手势能正常响应 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { return YES; } - (void)handleBlockGesture:(UITapGestureRecognizer *)gesture { // 这里可以留空,或者处理自定义的触摸逻辑,比如切换播放控制栏显示状态 }
这样就能有效避免幼儿误触导致视频被意外关闭啦!
内容的提问来源于stack exchange,提问作者Emily94
相关产品推荐
相关产品推荐

