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

Snip20170409_2.png

3.应用不退出后台,显示的是内存存的图片;每次重新启动,显示的是沙盒中存的图片

三 . 二维码

1.二维码的生成

首先导入框架#import <CoreImage/CoreImage.h>
下面是代码

-(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<UITouch *> *)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();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • 真机调试 打包测试 程序发布 内购 广告 推送通知 应用程序间跳转 社交分享 内存分析 换肤 硬件信息的获取 静态...
    翻这个墙阅读 243评论 0 1
  • 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会到今年的就...
    麦兜兜买兜兜阅读 676评论 1 4
  • 序言目 前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会到今年的就...
    阶梯阅读 467评论 0 1
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,243评论 11 349
  • 1. 父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 1.1 深拷贝同浅拷贝...
    iYeso阅读 1,891评论 0 13