十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章将为大家详细讲解有关怎么在iOS中实现微信文章悬浮球功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
10年积累的成都做网站、网站设计、外贸营销网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有天峻免费网站建设让你可以放心的选择与我们合作。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中实现微信文章悬浮球功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。