经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
iOS阅读器与直播的控件重叠滑动交互详解
来源:jb51  时间:2022/8/2 12:45:26  对本文有异议

场景一

进行一个阅读器项目的开发时,遇到了一个问题,

需要在点击绿色区域时弹出一个菜单,因此在该区域加了一个View,

然而,当在这个区域滑动时,滑动手势被绿色区域拦截,手势无法传递到下面的 UIPageViewController 的 View 上

描述

阅读器上方,摇啊摇,出来一个绿色的菜单

要求可以点,也可以拖动

拖动是下方 UIPageViewController 的事情。

手势被绿色视图挡住了,需要一个透传

思路:

把绿色视图的 hitTest View ,交给正在看的阅读器,那一页

这样拖动绿色视图,也可以滑动

  1. class GreenView: UIView{
  2. override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
  3. var afterThat = next
  4. while afterThat != nil{
  5. if let tmp = afterThat as? ViewController{
  6. if let target = tmp.pagedController.viewControllers?.first{
  7. return target.view
  8. }
  9. }
  10. else{
  11. afterThat = afterThat?.next
  12. }
  13. }
  14. return nil
  15. }
  16. }

同时要捕捉绿色视图的点击事件,

通过阅读页面的视图控制器,来捕捉

  1. class ContentCtrl: UIViewController {
  2. override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
  3. if let touch = touches.first, greenFrame.contains(touch.location(in: view)){
  4. NotificationCenter.default.post(name: .hitGreen, object: nil)
  5. }
  6. }
  7. }

场景二

用户在直播室,吃瓜

来了一条重要的消息,必须要用户处理,

用户退出直播室,也要展示,

同时不影响用户给主播送礼物

如上图,用户看到消息,也可以滑动阅读器

( 在消息的区域,滑动无效 )

思路肯定是 window,

脱离控制器,也能展示

实现一,创建新的 window

  1. class MsgWindow: UIWindow {
  2. init() {
  3. let originX: CGFloat = 50
  4. let width = UIScreen.main.bounds.width - originX * 2
  5. // 窗口大小固定
  6. super.init(frame: CGRect(x: originX, y: 100, width: width, height: 150))
  7. clipsToBounds = true
  8. layer.cornerRadius = 8
  9. backgroundColor = UIColor.cyan
  10. // 提升 zIndex
  11. windowLevel = UIWindow.Level.statusBar + 100
  12. isHidden = true
  13. }
  14. func show(){
  15. // 展现的必要配置
  16. if windowScene == nil, let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene{
  17. windowScene = scene
  18. }
  19. isHidden = false
  20. }
  21. }

实现 2,使用老的 window 和 View

  1. class MsgView: UIView {
  2. init() {
  3. let originX: CGFloat = 50
  4. let width = UIScreen.main.bounds.width - originX * 2
  5. super.init(frame: CGRect(x: originX, y: 100, width: width, height: 150))
  6. clipsToBounds = true
  7. layer.cornerRadius = 8
  8. backgroundColor = UIColor.cyan
  9. // 设置 z Index
  10. layer.zPosition = CGFloat.infinity
  11. isHidden = true
  12. }
  13. func show(){
  14. // 找到 key window,
  15. // 把视图,添加上去
  16. let scenes = UIApplication.shared.connectedScenes
  17. for sce in scenes{
  18. if let windowScene = sce as? UIWindowScene, windowScene.activationState == .foregroundActive , let win = windowScene.windows.first{
  19. isHidden = false
  20. win.addSubview(self)
  21. return
  22. }
  23. }
  24. }
  25. }

场景三

用户在直播室,吃瓜

来了一条重要的消息,必须要用户处理,

用户退出直播室,也要展示,

同时不影响用户给主播送礼物

这条消息,很长

( 在消息的区域,滑动有效 )

思路, 扩展场景 2 的第 2 种实现

一句话,限定了响应范围,

重写了 func point(inside

  1. class MsgView: UIView {
  2. let rect : CGRect = {
  3. let originX: CGFloat = 50
  4. let width = UIScreen.main.bounds.width - originX * 2
  5. return CGRect(x: originX, y: 100, width: width, height: 400)
  6. }()
  7. let btnRect = CGRect(x: 10, y: 10, width: 50, height: 50)
  8. init() {
  9. super.init(frame: rect)
  10. clipsToBounds = true
  11. layer.cornerRadius = 8
  12. backgroundColor = UIColor.clear
  13. layer.zPosition = CGFloat.infinity
  14. isHidden = true
  15. let bg = UIView(frame: CGRect(origin: .zero, size: rect.size))
  16. bg.backgroundColor = UIColor.cyan
  17. bg.alpha = 0.5
  18. addSubview(bg)
  19. let btn = UIButton(frame: btnRect)
  20. btn.backgroundColor = UIColor.red
  21. btn.layer.cornerRadius = 8
  22. btn.backgroundColor = UIColor.white
  23. addSubview(btn)
  24. btn.addTarget(self, action: #selector(hide), for: .touchUpInside)
  25. }
  26. @objc func hide(){
  27. isHidden = true
  28. }
  29. override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
  30. return btnRect.contains(point)
  31. }
  32. }

为啥这条消息,不用 scroll View ?

ha ha

同时,解决了场景一

一般情况下

github repo

到此这篇关于iOS阅读器与直播的控件重叠滑动交互详解的文章就介绍到这了,更多相关iOS重叠滑动内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号