监测iOS截屏(Swift)

原创 2015年11月17日 20:55:03

//

//  ScreenshotManager.swift

//  ImagePicker

//

//  Created by 成杰 on 15/11/17.

//  Copyright © 2015 成杰. All rights reserved.

//


import UIKit

import Foundation

import AssetsLibrary


class ScreenshotManager: NSObject {

    

    private var completion: ((UIImage) -> Void)? = nil

    class func detectScreenshot(completion: ((UIImage) -> Void)?) {

        let shared = self.shared

        shared.completion = completion

        shared.startTimer()

    }

    

    private static var shared: ScreenshotManager {

        dispatch_once(&Inner.token) { () -> Void in

            Inner.instance = ScreenshotManager()

        }

        return Inner.instance!

    }

    

    private struct Inner {

        static var instance: ScreenshotManager?

        static var token: dispatch_once_t = 0

    }

    

    private var timer: NSTimer? = nil

    private func startTimer() {

        timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "checkNewScreenshot", userInfo: nil, repeats: true)

    }

    

    private func stopTimer() {

        if timer != nil {

            timer!.invalidate()

            timer = nil

        }

    }

    

    private var groupCountDic = [String: Int]()

    func checkNewScreenshot() {

        print("ing...")

        let library = ALAssetsLibrary()

        library.enumerateGroupsWithTypes(ALAssetsGroupSavedPhotos, usingBlock: { (group, stop) -> Void in

            if group != nil {

                guard let groupName = group.valueForProperty(ALAssetsGroupPropertyPersistentID) as? String else {

                    return

                }

                group.setAssetsFilter(ALAssetsFilter.allPhotos())

                if self.groupCountDic[groupName] == nil {

                    self.groupCountDic[groupName] = group.numberOfAssets()

                }

                if group.numberOfAssets() > self.groupCountDic[groupName]! {

                    group.enumerateAssetsAtIndexes(NSIndexSet(index: group.numberOfAssets()-1), options: .Concurrent, usingBlock: { (alAsset, index, innerStop) -> Void in

                        if alAsset != nil {

                            let representation = alAsset.defaultRepresentation()

                            let latestPhoto = UIImage(CGImage: representation.fullScreenImage().takeUnretainedValue())

                            if latestPhoto.isScreenshot() {

                                dispatch_async(dispatch_get_main_queue(), { () -> Void in

                                    if self.completion != nil {

                                        self.completion!(latestPhoto)

                                    }

                                })

                            }

                            self.groupCountDic[groupName] = group.numberOfAssets()

                        }

                    })

                }

            }

            }) { (error) -> Void in

                print("error:\(error)")

        }

    }

    

    class func stopDetectingScreenshots() {

        self.shared.stopTimer()

        self.shared.completion = nil

        self.shared.timer = nil

    }

}


extension UIImage {

    func isScreenshot() -> Bool {

        let imageWidth = self.size.width;

        let imageHeight = self.size.height;

        let screenWidth = UIScreen.mainScreen().bounds.size.width

        let screenHeight = UIScreen.mainScreen().bounds.size.height

        return (fmod(imageWidth, screenWidth) == 0 && fmod(imageHeight, screenHeight) == 0) || (fmod(imageWidth, screenHeight) == 0 && fmod(imageHeight, screenWidth) == 0)

    }

}


// 用法

ScreenshotManager.detectScreenshot { (image) -> Void in

    self.imageView.image = image

}


iOS截屏相关头文件

  • 2015年08月07日 15:35
  • 31KB
  • 下载

iOS截屏的几种方法

  • 2013年09月16日 18:28
  • 50KB
  • 下载

iOS开发笔记之六十五——两种截屏方案的对比

******阅读完此文,大概需要3分钟****** 业务开发中常常需要截屏生成一张UIView的Image,我们前期就做了一个需要对UIView进行截屏的需求,iOS上截屏的方案有多种,因为我们需要控...
  • lizitao
  • lizitao
  • 2017年07月09日 11:26
  • 363

IOS截屏保存到相册

  • 2017年03月17日 14:41
  • 65KB
  • 下载

iOS 截屏功能

  • 2015年11月03日 13:22
  • 5KB
  • 下载

iOS截屏后仿今日头条实现一键分享

实现如上图效果1,监听截图产生事件 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userD...

IOS_截屏代码

  • 2015年05月31日 16:19
  • 424B
  • 下载

iOS 截屏程序

  • 2014年08月08日 16:27
  • 2.23MB
  • 下载

iOS应用截屏

iPhone自从推出后就自带了截屏功能,简单而易用,所以应用就没什么截屏的需求了,不过有些时候我们还是会遇到这个需求。比如,我们开发了一个播放器,用openGL进行video render,此时直接截...

ios中几种截屏的办法

1. UIGraphicsBeginImageContextWithOptions(pageView.page.bounds.size, YES, zoomScale);         [pag...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:监测iOS截屏(Swift)
举报原因:
原因补充:

(最多只允许输入30个字)