您好,登录后才能下订单哦!
这篇文章将为大家详细讲解有关怎么在iOS中实现微信文章悬浮球功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
1.悬浮球的出现
当我们通过屏幕边缘手势pop视图的时候,右下角会有一个圆角提示图,跟着手势进度移动。
如何获取到UIScreenEdgePanGestureRecognizer的进度呢?
因为系统自带的interactivePopGestureRecognizer是被封装起来的,它的action我们无法挂钩拿到里面的手势进度。所以,需要另辟蹊径了。
首先,让UINavigationController的delegate等于自己,然后让多个手势可以同时响应。
self.interactivePopGestureRecognizer?.delegate = self func 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手势进度,两者井水不犯河水,其乐融融。
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画一个四分之一圆,然后用CGPath的contains(point)
方法判断。
func updateBGLayerPath(isSmall: Bool) { var ratio:CGFloat = 1 if !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) }
关于怎么在iOS中实现微信文章悬浮球功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。