iOS阅读器与直播的控件重叠滑动交互详解

 更新时间:2022年08月02日 10:23:18   作者:dengjiangszhan  
这篇文章主要介绍了iOS阅读器与直播的控件发生重叠时滑动交互受到影响的问题,开发中某个控件出现在其它控件上方是和你常见的情况,但是如果影响到正常的交互这就会成为大问题,下面我们来了解一下

场景一

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

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

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

描述

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

要求可以点,也可以拖动

拖动是下方 UIPageViewController 的事情。

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

思路:

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

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

class GreenView: UIView{
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        var afterThat = next
        while afterThat != nil{
            if let tmp = afterThat as? ViewController{
                if let target = tmp.pagedController.viewControllers?.first{
                    return target.view
                }
            }
            else{
                afterThat = afterThat?.next
            }
        }
        return nil
    }
}

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

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

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

场景二

用户在直播室,吃瓜

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

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

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

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

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

思路肯定是 window,

脱离控制器,也能展示

实现一,创建新的 window

class MsgWindow: UIWindow {
    init() {
        let originX: CGFloat = 50
        let width = UIScreen.main.bounds.width - originX * 2
        // 窗口大小固定
        super.init(frame: CGRect(x: originX, y: 100, width: width, height: 150))
        clipsToBounds = true
        layer.cornerRadius = 8
        backgroundColor = UIColor.cyan
        // 提升 zIndex
        windowLevel = UIWindow.Level.statusBar + 100
        isHidden = true
    }
    func show(){
         // 展现的必要配置
        if windowScene == nil, let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene{
            windowScene = scene
        }
        isHidden = false
    }
}

实现 2,使用老的 window 和 View

class MsgView: UIView {
    init() {
        let originX: CGFloat = 50
        let width = UIScreen.main.bounds.width - originX * 2
        super.init(frame: CGRect(x: originX, y: 100, width: width, height: 150))
        clipsToBounds = true
        layer.cornerRadius = 8
        backgroundColor = UIColor.cyan
        // 设置 z Index
        layer.zPosition = CGFloat.infinity
        isHidden = true
    }
    func show(){
        // 找到 key window, 
        // 把视图,添加上去
        let scenes = UIApplication.shared.connectedScenes
        for sce in scenes{
            if let windowScene = sce as? UIWindowScene, windowScene.activationState == .foregroundActive , let win = windowScene.windows.first{
                isHidden = false
                win.addSubview(self)
                return
            }
        }
    }
}

场景三

用户在直播室,吃瓜

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

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

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

这条消息,很长

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

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

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

重写了 func point(inside

class MsgView: UIView {
    let rect : CGRect = {
        let originX: CGFloat = 50
        let width = UIScreen.main.bounds.width - originX * 2
        return CGRect(x: originX, y: 100, width: width, height: 400)
    }()
    let btnRect = CGRect(x: 10, y: 10, width: 50, height: 50)
    init() {
        super.init(frame: rect)
        clipsToBounds = true
        layer.cornerRadius = 8
        backgroundColor = UIColor.clear
        layer.zPosition = CGFloat.infinity
        isHidden = true
        let bg = UIView(frame: CGRect(origin: .zero, size: rect.size))
        bg.backgroundColor = UIColor.cyan
        bg.alpha = 0.5
        addSubview(bg)
        let btn = UIButton(frame: btnRect)
        btn.backgroundColor = UIColor.red
        btn.layer.cornerRadius = 8
        btn.backgroundColor = UIColor.white
        addSubview(btn)
        btn.addTarget(self, action: #selector(hide), for: .touchUpInside)
    }
    @objc func hide(){
        isHidden = true
    }
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        return btnRect.contains(point)
    }
}

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

ha ha

同时,解决了场景一

一般情况下

github repo

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

相关文章

  • iOS利用Label实现的简单高性能标签TagView

    iOS利用Label实现的简单高性能标签TagView

    这篇文章主要给大家介绍了关于iOS利用Label实现的简单高性能标签TagView的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • IOS开发OC代码中创建Swift编写的视图控制器

    IOS开发OC代码中创建Swift编写的视图控制器

    这篇文章主要介绍了IOS开发OC代码中创建Swift编写的视图控制器的相关资料,需要的朋友可以参考下
    2017-06-06
  • iOS xcconfig编写示例教程

    iOS xcconfig编写示例教程

    这篇文章主要为大家介绍了iOS xcconfig编写示例教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • iOS中的实时远程配置全纪录

    iOS中的实时远程配置全纪录

    这篇文章主要给大家介绍了关于iOS中实时远程配置的相关资料,文中通过示例代码介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-01-01
  • IOS 缓存文件的清除实现代码

    IOS 缓存文件的清除实现代码

    这篇文章主要介绍了IOS 缓存文件的清除的相关资料,详细说明了如何获取缓存文件,及缓存文件的清除步骤,需要的朋友可以参考下
    2016-10-10
  • IOS绘制虚线的方法总结

    IOS绘制虚线的方法总结

    这篇文章给大家分享了iOS中绘制虚线常见的几种方式,大家可以根据自己的需求进行选择哪种方法,下面跟着小编来一起看看吧。
    2016-09-09
  • iOS实现简单抽屉效果

    iOS实现简单抽屉效果

    这篇文章主要为大家详细介绍了iOS实现简单抽屉效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • iOS指纹验证TouchID应用学习教程

    iOS指纹验证TouchID应用学习教程

    这篇文章主要为大家详细iOS指纹验证TouchID应用学习教程的第一篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • iOS拨打电话的3种实现方式

    iOS拨打电话的3种实现方式

    这篇文章主要介绍了iOS拨打电话的3种实现方式 ,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • 谈谈iOS中的几种锁

    谈谈iOS中的几种锁

    这篇文章主要介绍了谈谈iOS中的几种锁,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-11-11

最新评论