一 . 实用技术
- 距离传感器
// 开启距离距离传感器
UIDevice.current.isProximityMonitoringEnabled = true
// 监听物体靠近或离开
NotificationCenter.default.addObserver(self, selector: #selector(stateChange), name: NSNotification.Name.UIDeviceProximityStateDidChange, object: nil)
移除通知和监听方法,需要真机测试
deinit {
NotificationCenter.default.removeObserver(self)
}
func stateChange() {
if UIDevice.current.proximityState {
print("物体靠近")
}else{
print("物体离开")
}
}
2 . 加速器
首先导入import CoreMotion 框架
// 1. 创建运动管理者
let manger = CMMotionManager()
override func viewDidLoad() {
super.viewDidLoad()
// 判断加速器是否可用
if manger.isAccelerometerAvailable {
// 设置采样间隔
manger.accelerometerUpdateInterval = 1.0/5
// 开始采集数据并向外界展示
manger.startAccelerometerUpdates(to: OperationQueue.main, withHandler: { (data:CMAccelerometerData?, error :Error?) in
if error == nil{
print(data?.acceleration.x,data?.acceleration.y,data?.acceleration.z ?? <#default value#>)
}
})
}else{
print("加速器不可用")
}
}
3 . 摇一摇
实现摇一摇功能,其实非常简单,这都是苹果帮我们封装好的,只需调用,跟touch begin 一样,只需调用,代码如下
override func motionBegan(_ motion: UIEventSubtype, with event: UIEvent?) {
print("摇一摇开始")
}
override func motionEnded(_ motion: UIEventSubtype, with event: UIEvent?) {
print("摇一摇结束") // 摇结束后做一些操作
}
override func motionCancelled(_ motion: UIEventSubtype, with event: UIEvent?) {
print("摇一摇终止") // 比如来电期间
}
4 . 计步器
还是先导入import CoreMotion
// 判断计步器是否可用
if !CMPedometer.isStepCountingAvailable() {
print("计步器不可用")
return
}
// 开始记步
pedometer.startUpdates(from: NSDate(timeIntervalSinceNow: 0) as Date) { (data: CMPedometerData?, error: Error?) in
if error == nil{
print("走了\(String(describing: data?.numberOfSteps))步,一共\(String(describing: data?.distance))KM")
print("hahah")
}
}
}
5 . 重力
首先懒加载创建仿真器
// 创建仿真器,懒加载
lazy var animator:UIDynamicAnimator = {
return UIDynamicAnimator(referenceView: self.view)
}()
其次创建仿真行为
func gravity() {
// 创建仿真行为
let gravity = UIGravityBehavior(items: [image1])
// 属性
// gravity.angle = CGFloat(M_PI)
// gravity.gravityDirection = CGVector(dx: 100, dy: 100)
// 把仿真行为加到仿真器
animator.addBehavior(gravity)
}
6 . 碰撞
func collision() {
//创建仿真行为
let coll = UICollisionBehavior(items: [image1,image2])
// 回弹
coll.translatesReferenceBoundsIntoBoundary = true
coll.collisionMode = UICollisionBehaviorMode.everything
coll.collisionDelegate = self as? UICollisionBehaviorDelegate
// 设置边界的内边距
coll.setTranslatesReferenceBoundsIntoBoundary(with: UIEdgeInsetsMake(20, 20, 20, 20))
animator.addBehavior(coll)
}
7 . push推
func push() {
// 1. 创建推行为
// case Continuous 一直推
// case Instantaneous 推一次
let behavior = UIPushBehavior(items: [image1], mode: UIPushBehaviorMode.instantaneous)
// 1.1 设置推的方向
behavior.pushDirection = CGVector(dx: 0, dy: -6)
// 2. 添加行为到仿真器, 开始执行行为
animator.addBehavior(behavior)
}
8 . 捕捉点
// 如果想要多次执行捕捉行为, 那么必须在之前移除已经添加的捕捉行为
animator.removeAllBehaviors()
// 1. 创建捕捉行为
let behavior = UISnapBehavior(item: image2, snapTo: point)
behavior.damping = 1.0
// 2. 添加行为到仿真器, 开始执行
animator.addBehavior(behavior)
二 . 图片缓存原理
1.首先查看内存中是否存在,存在的话直接使用,
2.如果内存中没有,再查看沙盒中是否存在,如果沙盒中有,就设置图片,再存入内存;如果沙盒中也没有, 就查看是否有下载操作,如果正在下载什么都不做,安静的等下载完成,如果没有下载操作,就开线程放在队列中下载 ,下载完成后,移除下载操作,设置图片,刷新表格,然后存入内存,存入沙盒
3.应用不退出后台,显示的是内存存的图片;每次重新启动,显示的是沙盒中存的图片
三 . 二维码
1.二维码的生成
首先导入框架#import
下面是代码
-(void)setData:(NSString *)str
{
// 1.创建二维码滤镜
CIFilter * filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
// 1.1 恢复默认设置
[filter setDefaults];
// 2.设置过滤输入数据
// 2.1 字符串转data
NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:data forKey:@"inputMessage"];
// 3,从二维码滤镜里面,获取结果图片
CIImage * image = [filter outputImage];
// 3.1缩放图片
image = [image imageByApplyingTransform:CGAffineTransformMakeScale(20, 20)];
// 4.图片处理,设置图片
self.imageView.image = [UIImage imageWithCIImage:image];
}
2 . 识别图中二维码
// 1. 需要获取的图片
CIImage * image = [[CIImage alloc] initWithImage:_imageView.image];
// 2.开始识别
CIDetector * detetor = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];
// 3.探测二维码特征
NSArray * fetures = [detetor featuresInImage:image];
// 4.遍历数组
for (CIFeature * feature in fetures) {
CIQRCodeFeature * fe = (CIQRCodeFeature *)feature;
_textLabel.text = fe.messageString;
}
3 . 扫描识别
目前只是扫描显示结果,没做中间的显示对焦框
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
// 扫描
AVCaptureSession * session = [[AVCaptureSession alloc] init];
// 1. 设置输入
AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
// 把摄像头当做输入设备
AVCaptureDeviceInput * input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
[session addInput:input];
// 2. 设置输出
AVCaptureMetadataOutput * outInput = [[AVCaptureMetadataOutput alloc] init];
// 设置输出结果的代理
[outInput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[session addOutput:outInput];
// 3. 创建会话,连接输入和输
// 3.1 设置二维码可以识别的码制
[outInput setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
// 3.2 添加视频预览图层
AVCaptureVideoPreviewLayer * layer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
layer.frame = self.view.bounds;
[self.view.layer addSublayer:layer];
// 4. 启动扫描
[session startRunning];
}
// 代理方法,扫描到结果调用
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
if (metadataObjects.count >0) {
AVMetadataMachineReadableCodeObject * objt = [metadataObjects lastObject];
NSLog(@"---------%@-------",objt);
}
}
Demo地址
四 .block
block 值的传递
如果是局部变量,block是值传递
如果是全局变量,静态变量,__block修饰的变量,block都是指针传递
int a = 3;
void(^block)() = ^() {
NSLog(@"%d",a);
};
a = 5;
block();