50天iOS挑戰(Swift) - 第3天:簡單利用CoreLocation獲取當前地址
50天,每天一個Swift語言的iOS練手項目,覆蓋iOS開發的主要知識。貴在堅持,重在思考
文章列表:http://www.lxweimin.com/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。多謝~