You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

面向幼儿的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:15:11