iOS 实用技术

一 . 实用技术

  1. 距离传感器
        // 开启距离距离传感器
        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.如果内存中没有,再查看沙盒中是否存在,如果沙盒中有,就设置图片,再存入内存;如果沙盒中也没有, 就查看是否有下载操作,如果正在下载什么都不做,安静的等下载完成,如果没有下载操作,就开线程放在队列中下载 ,下载完成后,移除下载操作,设置图片,刷新表格,然后存入内存,存入沙盒

iOS 实用技术_第1张图片
Snip20170409_2.png

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();

你可能感兴趣的:(iOS 实用技术)