前言

微信在最新版本6.6.7,新加了一个文章悬浮球功能。当你正在阅读文章的时候,突然有好友发来了紧急消息,你需要立即回复。又或者你刚好路过小吃店,需要临时打开微信支付,等等临时中断阅读的情况。以前只有退出文章详情页面,处理完事情之后,再挨着挨着找到原来的文章。对于我们这种重度微信使用者来说,每次遭遇这种情况,真的很蛋疼。所以,当这个功能推出的事情,立马更新了最新版本,这个功能感觉就像遇到了知心人一样,用起来十分顺手。可以通过下面的动图感受一下

JXWeChatFloatView.gif

其实悬浮球的概念早就有了。比如360助手的流量监控球,iPhone自带的AssitiveTouch(就是那个可爱的小白球)等等。

仓库地址

Github地址喜欢就点颗❤️

核心技术点

体验过后,让人手痒痒,情不自禁得想要模仿一把。如果你的APP可以集成该功能,我觉得可以让你的APP逼格瞬间提升一个level。好了,下面让我们来一一解剖,微信文章悬浮球的核心技术点:

1.悬浮球的出现

当我们通过屏幕边缘手势pop视图的时候,右下角会有一个圆角提示图,跟着手势进度移动。
如何获取到UIScreenEdgePanGestureRecognizer的进度呢?
因为系统自带的interactivePopGestureRecognizer是被封装起来的,它的action我们无法挂钩拿到里面的手势进度。所以,需要另辟蹊径了。

  • 首先,让UINavigationController的delegate等于自己,然后让多个手势可以同时响应。
self.interactivePopGestureRecognizer?.delegate = selffunc gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {return true}
  • 然后自己添加一个UIScreenEdgePanGestureRecognizer到UINavigationController上面,用于获取pop手势的进度。
let gesture = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(handleNavigationTransition(gesture:)))
gesture.edges = .left
self.view.addGestureRecognizer(gesture)

这样子,有两个UIScreenEdgePanGestureRecognizer可以同时响应,系统自带的依然保持原有逻辑不动,我们新增的用于获取pop手势进度,两者井水不犯河水,其乐融融。该技巧我的这篇文章也有使用iOS:一分钟集成主流APP个人资料页(如简书、微博等)

2.悬浮球全局置顶

既然悬浮球可以在悬浮在任何一个页面,必然是放在一个新的UIWindow上面。比如系统的键盘弹出的时候,就是一个UIRemoteKeyboardWindow在承载。
然后这个window的生命周期不依赖某一个页面,所以用单例实现比较好。这块代码比较分散,直接看源码就可以了解

3.事件响应

  • 悬浮UIWindow的事件传递
    只要事件位置没有在圆球和右下角上,就不响应
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {let roundEntryViewPoint = self.convert(point, to: roundEntryView)if roundEntryView.point(inside: roundEntryViewPoint, with: event) == true {return true}let collectViewPoint = self.convert(point, to: collectView)if collectView.point(inside: collectViewPoint, with: event) == true {return true}return false}
  • 右下角四分之一圆,事件响应
    可以看到微信,只有当手指移动进右下角圆内,才能进行悬浮。而不是按着视图的frame来响应。
    首先,通过UIBezierPath画一个四分之一圆,然后用CGPathcontains(point)方法判断。
func updateBGLayerPath(isSmall: Bool) {var ratio:CGFloat = 1if !isSmall {ratio = 1.3}let path = UIBezierPath()path.move(to: CGPoint(x: viewSize.width, y: (1 - ratio)*viewSize.height))path.addLine(to: CGPoint(x: viewSize.width, y: viewSize.height))path.addLine(to: CGPoint(x: (1 - ratio)*viewSize.width, y: viewSize.height))path.addArc(withCenter: CGPoint(x: viewSize.width, y: viewSize.height), radius: viewSize.width*ratio, startAngle: CGFloat(Double.pi), endAngle: CGFloat(Double.pi*3/2), clockwise: true)path.close()bgLayer.path = path.cgPath}override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {return bgLayer.path!.contains(point)}

对这块不太了解的同学,可以参考这篇文章。一篇搞定事件传递、响应者链条、hitTest和pointInside的使用

4.自定义转场动画

可以看到点击悬浮球打开的文章,是通过一个自定义转场动画实现的,从悬浮球的位置开始展开。
有许多文章都有讲解如何自定义转场动画,但是我推荐你看这篇文章几句代码快速集成自定义转场效果+ 全手势驱动

实现效果

JXWeChatFloatView-2.gif

总结

微信的悬浮球,用到的技术点相对比较多,代码也比较分散,如果你的APP要集成该功能,需要认真封装代码。
相对于如何实现,我认为如何设计好一个需求更重要。我在模仿的过程中,发现其中有许多细节的逻辑,彼此环环相扣,最终就呈现出了你正在使用的悬浮球功能。
都说程序员和产品经理是相爱相杀,在这里我要为该功能的产品经理点个赞

iOS:高仿微信文章悬浮球相关推荐

  1. iOS高仿微信悬浮窗、忍者小猪游戏、音乐播放器、支付宝、今日头条布局滚动效果等源码...

    iOS精选源码 iOS WKWebView的使用源码 模仿apple music 小播放器的交互实现 高仿微信的悬浮小窗口 iOS仿支付宝首页效果 [swift]仿微信悬浮窗 类似于今日头条,网易新闻 ...

  2. iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...

    2019独角兽企业重金招聘Python工程师标准>>> iOS精选源码 iOS高仿微信完整项目源码 Khala: Swift 编写的iOS/macOS 路由框架 微信左滑删除效果的实 ...

  3. iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码

    iOS精选源码 iOS高仿微信完整项目源码 Khala: Swift 编写的iOS/macOS 路由框架 微信左滑删除效果的实现与TableViewCell的常用样式介绍 实现阴影圆角并存,渐变色背景 ...

  4. iOS高仿微信完整源码,网易爱玩APP源码等

    iOS精选源码 iOS一种弹出视图效果带动画 一个快速便捷.无侵入.可扩展的动画弹框库 高仿Elk - 旅行货币转换器 iOS内分享的界面.功能一体化解决方案 使用Olami sdk实现一个语音查询股 ...

  5. iOS 高仿微信相机拍摄和编辑

    效果描述: 1.自定义相机 拍摄视频和照片 2.切换前后摄像头.调整焦距/设置聚焦点.横屏拍摄 3.视频编辑:涂鸦.贴图.文字水印.视频裁剪 .添加背景音乐 4 .图片编辑:涂鸦.贴图.文字水印.马赛 ...

  6. iOS高仿微信、仪表盘、图片标注图片滤镜、高斯模糊、上拉加载、下拉刷新等源码

    iOS精选源码 Swift-图片画框标注 Swift版的上拉加载, 下拉刷新控件(一句话集成, 超级易用) iOS tabbar上的提示框 Swift图片浏览器,经过一年多维护,已基本稳定 图片滤镜 ...

  7. iOS高仿微信、仪表盘、图片标注图片滤镜、高斯模糊、上拉加载、下拉刷新等源码...

    iOS精选源码 Swift-图片画框标注 Swift版的上拉加载, 下拉刷新控件(一句话集成, 超级易用) iOS tabbar上的提示框 Swift图片浏览器,经过一年多维护,已基本稳定 图片滤镜 ...

  8. android 仿ios悬浮窗,iOS高仿微信悬浮窗、忍者小猪游戏、音乐播放器、支付宝、今日头条布局滚动效果等源码...

    iOS精选源码 iOS优质博客 之前看了很多面试题,感觉要不是不够就是过于冗余,于是我将网上的一些面试题进行了删减和重排,现在分享给大家.(题目来源于网络,侵删)1. Object-c的类可以多重继承 ...

  9. iOS高仿微信发朋友圈,图片拖拽,删除组件

    源码地址:https://github.com/Jethuang/HDragImageView

最新文章

  1. 计算机二级应用题改卷,全国计算机等级考试二级Python语言程序设计模拟试卷B卷综合应用题-Go语言中文社区...
  2. Asp.net(c#)实现多线程断点续传
  3. Error Code: 1175. You are using safe update mode and you tried to ......
  4. 逻辑判断-if语句/文件目录属性判断/case判断
  5. aapt2 资源 compile 过程
  6. java.library.path到底指什么
  7. python发邮件图片太长显示不出来_Python电子邮件图像太长,无法显示,为什么Python在发送多图表电子邮件时只显示第一个图像?,python,发邮件,图片,不,出来,第一张...
  8. 第四堂:Java程序运行期数据区
  9. 全国行政区划代码(json对象)---包含键值对的城市代号和城市名称的json对象代码(不包括县级市)
  10. 全球十大交易系统(Futures Truth Magazine评选)及各交易系统详解
  11. Java生成二维码图片并打包下载
  12. win10配置免密登录linux(centos7)
  13. Druid实战--摄入数据规范Ingestion Spec
  14. 【《Real-Time Rendering 3rd》 提炼总结】(二) 第二章 · 图形渲染管线 The Graphics Rendering Pipeline
  15. jQuery-file-upload插件的使用(小实例)
  16. Photoshop插件-charIDToTypeID-PIStringTerminology.h-不同值的解释及参考-脚本开发-PS插件
  17. Android开发之BroadcastReceiver
  18. php如何继续提升技术?一个php技术栈后端猿的知识储备仓库
  19. 红旗linux hba卡wwn,HBA卡WWN号查看方法
  20. 台湾省九齐NY8B062E与NY8B062D对比区别差异

热门文章

  1. 3D姿态估计:语义图卷积SematicGCN与GAN-RepNet
  2. **java 发送邮件**
  3. 【瑞吉外卖】学习笔记-day5:(三)手机验证码登录(用邮件发送代替)
  4. c语言实验报告绘制钟表,单片机时钟程序实验报告
  5. Apple usb Ethernet adapter for windows 驱动下载
  6. 王者荣耀永不缺席称号如何获得 王者荣耀永不缺席称号获得方法
  7. [iOS]NSArray:数组(NSArray)使用注意
  8. 中南大学21年计算机考研情况 专硕录取均分接近400分!
  9. 复盘:智能城市如何成为『京东集团一级战略』?...
  10. Python 进阶 — Pylint 静态代码检查工具