iOS 实现摇一摇截屏功能

今天领导在群里发了这样一个图


图一

并配上了这样一句话


图二

意图明显,安排~
安排

实现

经过不那么久的时间研究,发现实现这个小功能非常简单,只需要调用系统内置的几个代理方法即可实现,具体实现如下

1、创建一个UIViewController的分类,在.m文件中UIViewController+Category.m代码如下
- (BOOL)becomeFirstResponder {
    return YES;
}

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    NSLog(@"开始摇一摇");
}

- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    NSLog(@"取消摇一摇");
}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    NSLog(@"结束摇一摇");
    /// 可以获取UISwitch状态(沙盒),如果关闭了,直接return
    if (event.type == UIEventSubtypeMotionShake) {
        /// 震动反馈
        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
    }
    /// 在这里做业务处理
    /// 可以在这里获取截图[self handlerScreenshot];做界面跳转等
}
2、在需要使用该功能的ViewController代理中,如下
#import "UIViewController+Category.h"

- (void)viewDidLoad {
    [super viewDidLoad];
     /// 打开应用手持震动响应
    [[UIApplication sharedApplication] setApplicationSupportsShakeToEdit:YES];
    /// 
    [self becomeFirstResponder];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    /// 
    [self resignFirstResponder];
}
/// 至此,当前控制器已经可以响应手持震动了
/// 如果需要在整个应用程序中都支持该功能,将#import写在pch文件中
/// 或者基类控制器中,然后在基类代理中实现以上调用过程即可
3、关于截屏
/// 该方法写在UIViewController+Category.m文件中
/// 高质量截屏
#pragma mark - 处理截屏
- (UIImage *)handlerScreenshot {
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
//    UIGraphicsBeginImageContext(window.frame.size); /// 这个方式获取的图片清晰度很低
    UIGraphicsBeginImageContextWithOptions(window.bounds.size, YES, 0.0);
    [window.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return screenshot;
}
补充

关于UISwitch控制的实现,使用沙盒存一个bool值即可,懂的都懂~
关于在跳转后的控制器中不需要这个功能的时候,可以使用以下代码

/// 关闭手机震动交互----全局配置的时候,这个好像不起作用。
/// 建议使用开关的状态值去控制这个功能的交互
[[UIApplication sharedApplication] setApplicationSupportsShakeToEdit:NO];

注意,注释有时候很有用,根据业务需求,局部和全局的控制自行调整

你可能感兴趣的:(iOS 实现摇一摇截屏功能)