【30-swift-projects-in-30-days】Swift 5 学习记录
在 03.Find My Position 项目中主要学习的是CLLocation定位。CoreLocation框架可用于定位设备当前经纬度,通过该框架,应用程序可通过附近的蜂窝基站,WIFI信号或者GPS等信息计算用户位置。
1.获取位置信息
(1)创建CLLocationManager对象,该对象负责获取定位相关信息。并为该对象设置一些必要的属性。
(2)为CLLocationManager指定delegate属性,该属性值必须是一个实现CLLocationManagerDelegate协议的对象。实现CLLocationManagerDelegate协议时可根据需要实现协议中特定的方法。
(3)调用CLLocationManager的startUpdatingLocation方法获取定位信息。定位结束时,可调用stopUpdatingLocation方法结束获取定位信息。
第一步:在CoreLocation.framework添加到项目中去
第二步:在iOS8中需要在info.plist中添加NSLocationAlwaysAndWhenInUseUsageDescription
及 NSLocationWhenInUseUsageDescriptio
两个字段。
不配置这两个字段会报如下错误:
FindMyPosition[10463:217697] This app has attempted to access
privacy-sensitive data without a usage description.
The app's Info.plist must contain
both “NSLocationAlwaysAndWhenInUseUsageDescription”
and “NSLocationWhenInUseUsageDescription” keys with
string values explaining to the user how the app uses this data
另外,在模拟器上获取地址位置时,会提示“Error Domain=kCLErrorDomain Code=8”错误,但是使用真机就会正常。
2.view的frame和bounds之区别(位置和大小)
在项目中看到如下代码:
findMyLocationBtn.frame = CGRect(x: 50, y: self.view.bounds.height - 80, width: self.view.bounds.width - 100, height: 50)
其中有self.view.bounds.width,联想到在02.Watch'sDemo中使用过self.view.frame.width,探究了一下两者的区别。如下:
frame定义了一个view相对于父视图坐标系的位置和大小,它会影响center属性和bounds属性的size。
这里需要做个特殊说明,frame的坐标是相对于父视图坐标系的,所以在设置的时候需要明白,父视图是什么,一个View的父视图就是这个view被谁addSubview了。如果view1. addSubview(view2) view2. addSubview(view3) 那么view3的父视图就是view2,而不是view1
Bounds也是描述的是视图的位置和大小,只不过是在自己的坐标系上。也就是说它描述的是当前视图相对于自身坐标系的位置和大小。
简而言之,就是frame和bounds的width和height是一样的,唯独坐标是不一样,frame的坐标是相对于父视图的,bounds是相对于自己的。
学习源码来自 https://github.com/nimomeng/30-swift-projects-in-30-days ,其Swift语言版本为 4.1 。
学习过程我会将代码语言版本改成Swift 5,代码地址:https://github.com/dong706/30-swift-projects-in-30-days/ 。
参考文章:iOS布局』frame与bounds