地图导航:
该导航不用添加 mapView,利用系统自带的地图实现导航;
/**
* 该导航不用添加 mapView;
* 1.拿到用户输入的目的地;
* 2.地理编码;
* 2.1创建地理编码的实例对象;
* 2.2取出地理编码坐标;
* 2.3利用CLPlacemark来创建MKPlacemark
* 2.4利用MKPlacemark来创建目的地的MKMapItem
* 2.5拿到起点的MKMapItem
* 3.开始导航;
* 3.1.将起点和终点item放入数组中;
* 3.2.设置Options参数(字典);
* 3.3.开始导航;
*/
设置地图的导航路线,添加遮盖物overlay,
生词: direction: 方向; calculate: 计算,计划; response: 答复; route: 路径; Overlay: 遮盖物;
/**
* 1.创建MKDirectionsRequest对象 MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
* 1.1.设置起点的Item : request.source = sourceItem;
* 1.2.设置终点的Item : request.destination = destinationItem;
* 2.创建MKDirections对象 MKDirections *directions = [[MKDirections alloc] initWithRequest:request];
* 3.请求/计算(当请求到路线信息的时候会来到该方法): [directions calculateDirectionsWithCompletionHandler:此处为 block 函数];
* 3.1.当有错误,或者路线数量为0直接返回: fi (error || response.routes.count == 0 ) return;
* 3.2.遍历所有的路线: for (MKRoute *route in response.routes)
* 3.3.取出路线(遵守MKOverlay) : MKPolyline *polyline = route.polyline;
* 3.4.将路线添加到地图上: [self.mapView addOverlay: polyline];
* 4当一个遮盖添加到地图上时会执行该方法: - (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(MKPolyline *)overlay
* 4.1 创建遮盖物实例对象; MKPolylineRenderer *poly = [[MKPolylineRenderer alloc] initWithPolyline:overlay];
* 4.1设置线条颜色与宽度; poly.strokeColor = [UIColor yellowColor]; poly.lineWidth = 5.0;
*/
传感器的实现
// 距离传感器默认是关闭(实时的检测是否有物品靠近,所有非常耗电)
[UIDevice currentDevice].proximityMonitoringEnabled = YES;
// 通过通知(一旦有物品靠近或者离开的时候,都会发出通知)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChange) name:UIDeviceProximityStateDidChangeNotification object:nil];
/**
* 当有物品靠近或者离开的时候会调用该方法
*/
- (void)proximityStateDidChange{
if ([UIDevice currentDevice].proximityState) {
NSLog(@"有物品靠近");
} else {
NSLog(@"有物品离开");
}
}
摇一摇功能:
摇一摇功能与touch 的相似; 生词: motion:运动,打手势,移动;
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{};
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event{};
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{};
通过蓝牙彼此发送照片 GameKit
生词: peer: 仔细看;
/** 设备查找
* 1.创建查找设备的控制器; GKPeerPickerController *ppc = [[GKPeerPickerController alloc] init];
* 2.设置代理; < UINavigationControllerDelegate,
UIImagePickerControllerDelegate>
* 3.弹出控制器; [ppc show];
* 4.1 设备链接成功后调用此方法: - (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session
* 4.2保留会话: self.session = session;
* 4.3设置数据的接受着: [self.session setDataReceiveHandler:self withContext:nil];
* 4.3退出查找设备的控制器: [picker dismiss];
选择照片
* 1.判断照片源是否可用; if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) return;
* 2.创建照片选择控制器: UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
* 3.设置照片源: ipc.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
* 4.设置代理: <GKPeerPickerControllerDelegate>
* 5.弹出控制器: [self presentViewController:ipc animated:YES completion:nil];
发送照片
* 0.判断image如果为空直接返回: if (!self.imageView.image) return;
* 1.将UIImage转化成NSData: NSData *imageData = UIImageJPEGRepresentation(self.imageView.image, 0.5);
* 2.发送照片: [self.session sendDataToAllPeers:imageData withDataMode:GKSendDataReliable error:nil];
接受数据
* 当接受收到数据的时候会调用该方法
* - (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context
* 1.将NSData转化成UIImage对象: UIImage *receiveImage = [UIImage imageWithData:data];
* 2.设置到imageView上: self.imageView.image = receiveImage;
* 3.将图片保存到相册当中: UIImageWriteToSavedPhotosAlbum(receiveImage, nil, nil, nil);
蓝牙的使用: CoreBluetooth
生词: scan:扫描; Peripherals:外围设备;
代理: <CBCentralManagerDelegate,CBPeripheralDelegate>
Core Bluetooth的开发步骤
建立中心设备
扫描外设(Discover Peripheral)
连接外设(Connect Peripheral)
扫描外设中的服务和特征(Discover Services And Characteristics)
利用特征与外设做数据交互(Explore And Interact)
断开连接(Disconnect)
1.扫描所有的外围设备
serviceUUIDs:可以将你想要扫描的服务的外围设备传入(传nil,扫描所有的外围设备)
[self.mgr scanForPeripheralsWithServices:nil options:nil];
#pragma mark - CBCentralManager的代理方法
状态发生改变的时候会执行该方法(蓝牙4.0没有打开变成打开状态就会调用该方法)
- (void)centralManagerDidUpdateState:(CBCentralManager *)central{}
/**
* 当发现外围设备的时候会调用该方法
*
* @param peripheral 发现的外围设备
* @param advertisementData 外围设备发出信号
* @param RSSI 信号强度
*/
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
if (![self.peripherals containsObject:peripheral]) {
[self.peripherals addObject:peripheral];
}
}
/**
* 连接上外围设备的时候会调用该方法
* @param peripheral 连接上的外围设备
*/
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
// 1.扫描所有的服务
// serviceUUIDs:指定要扫描该外围设备的哪些服务(传nil,扫描所有的服务)
[peripheral discoverServices:nil];
// 2.设置代理
peripheral.delegate = self;
}
#pragma mark - CBPeripheral的代理方法
* 发现外围设备的服务会来到该方法(扫描到服务之后直接添加peripheral的services)
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
for (CBService *serivce in peripheral.services) {
if ([serivce.UUID.UUIDString isEqualToString:@"123"]) {
// characteristicUUIDs : 可以指定想要扫描的特征(传nil,扫描所有的特征)
[peripheral discoverCharacteristics:nil forService:serivce];
}
}
}
/**
* 当扫描到某一个服务的特征的时候会调用该方法
* @param service 在哪一个服务里面的特征
*/
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{
for (CBCharacteristic *characteristic in service.characteristics) {
if ([characteristic.UUID.UUIDString isEqualToString:@"456"]) {
// 拿到特征,和外围设备进行交互
}
}
}
#pragma mark - 连接设备
- (void)connect:(CBPeripheral *)peripheral{ //自定义的方法
// 连接外围设备
[self.mgr connectPeripheral:peripheral options:nil];
}
#pragma mark - 懒加载代码
- (CBCentralManager *)mgr{
if (_mgr == nil) {
_mgr = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
}
return _mgr;
}