50天iOS挑战(Swift) - 第3天:简单利用CoreLocation获取当前地址
50天,每天一个Swift语言的iOS练手项目,覆盖iOS开发的主要知识。贵在坚持,重在思考
文章列表:http://08643.cn/nb/13566182
Github项目:https://github.com/Minecodecraft/50DaysOfSwift
简介
做一个利用CoreLocation获取当前地址的小demo,任务量较小,放松一下
主要知识点: CoreLocation
过程
1、 CoreLocation简介
CoreLocation是用于定位设备当前位置的框架,该框架可以利用蜂窝基站、WiFi、GPS等多种信息计算用户当前位置,同时该框架也可与包括MapKit在内的众多框架无缝共用,实现强大的基于位置的功能,在应用中使用频繁。
CoreLocation的使用主要CLLocationManager和CLLocationManagerDelegate两个核心类,前者提供定位、区域检测、方向等核心API,后者则处理前者的相关事件代理。
Tips 1. 定位权限的设置
iOS8起,程序获取定位权限需要显示调用requestWhenInUseAuthorization()或requestAlwaysAuthorization(),前者对应应用程序运行时才定位,后者对应始终定位,同时需要在Info.plist中设置"Privacy - Location When In Use Usage Description"
和 "Privacy - Location Always and When In Use Usage Description"
。如果应用支持iOS 10及更早的系统,还要设置"Privacy - Location Always Usage Description"
。
服务 | 是否支持 | 是否支持 |
---|---|---|
标准定位服务 | 支持 | 支持 |
重大变化的位置服务 | 不支持 | 支持 |
访问服务 | 不支持 | 支持 |
区域检测 | 不支持 | 支持 |
iBeacon范围 | 支持 | 支持 |
标题服务 | 支持 | 支持 |
地理编码服务 | 支持 | 支持 |
Tips 2. 不同模式所支持的服务
服务 | 是否支持 | 是否支持 |
---|---|---|
标准定位服务 | 支持 | 支持 |
重大变化的位置服务 | 不支持 | 支持 |
访问服务 | 不支持 | 支持 |
区域检测 | 不支持 | 支持 |
iBeacon范围 | 支持 | 支持 |
标题服务 | 支持 | 支持 |
地理编码服务 | 支持 | 支持 |
2、 界面实现
首先添加上述两个view,bkgView为背景,popupView为弹出窗口
// 添加带透明度的背景视图,从而实现下方视图变暗
guard let window = UIApplication.shared.keyWindow else { return }
bkgView = UIView()
bkgView.frame = window.bounds
bkgView.backgroundColor = UIColor(white: 0.1, alpha: 0.6)
window.addSubview(bkgView)
// 添加弹出控件,添加到window而不是bkgView
popupView = UIView()
popupView.frame = CGRect(x: 30, y: kScreenHeight, width: kScreenWidth-60, height: 60)
popupView.backgroundColor = UIColor.orange
popupView.layer.cornerRadius = 15
window.addSubview(popupView)
3、 动画实现
iOS简单动画实现起来很容易,通过UIView提交一个动画即可,采用尾随闭包来写。
// 添加一个弹出动画
UIView.animate(withDuration: 0.3) {
// 尾随闭包播放弹出动画
self.popupView.frame = CGRect(x: 30, y: (kScreenHeight-60)/2, width: kScreenWidth-60, height: 60)
}
// 收回动画
UIView.animate(withDuration: 0.3) {
// 尾随闭包播放弹出动画
self.popupView.frame = CGRect(x: 30, y: kScreenHeight, width: kScreenWidth-60, height: 60)
// 提交一个延时任务线程
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
self.popupView.removeFromSuperview()
self.bkgView.removeFromSuperview()
}
}
一点小小的补充
- 项目源码地址 50DaysOfSwift,欢迎前来支持,随手留个Star。多谢~