今天领导在群里发了这样一个图
并配上了这样一句话
意图明显,安排~
实现
经过不那么久的时间研究,发现实现这个小功能非常简单,只需要调用系统内置的几个代理方法即可实现,具体实现如下
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];
注意,注释有时候很有用,根据业务需求,局部和全局的控制自行调整