一. 實現的效果相似微博的截圖分享ios
不只截圖分享的時候還進行圖片的修改,增長本身的二維碼windows
二.實現方式微信
蘋果在ios7以後提供了一個新的通知類型:UIApplicationUserDidTakeScreenshotNotification,ide
這個通知會告知註冊了此通知的對象已經發生了截屏事件,而後咱們就能夠在這個事件中實現本身的邏輯測試
1.註冊通知spa
- (void)viewDidLoad { [super viewDidLoad]; //註冊用戶的截屏操做通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userDidTakeScreenshot:) name:UIApplicationUserDidTakeScreenshotNotification object:nil]; }
2.接收通知 (獲取截圖並修改的圖片,並展現,展現UI,能夠本身修改)code
//截屏響應 - (void)userDidTakeScreenshot:(NSNotification *)notification { NSLog(@"檢測到截屏"); //人爲截屏, 模擬用戶截屏行爲, 獲取所截圖片 _testImg = [self imageWithScreenshot]; // //添加顯示 UIImageView *imgvPhoto = [[UIImageView alloc]initWithImage:_testImg]; imgvPhoto.frame = CGRectMake(0, WIN_HEIGHT/2, WIN_WIDTH/2, WIN_HEIGHT/2); imgvPhoto.backgroundColor = [UIColor orangeColor]; imgvPhoto.userInteractionEnabled = YES; //添加邊框 CALayer * layer = [imgvPhoto layer]; layer.borderColor = [[UIColor whiteColor] CGColor]; layer.borderWidth = 5.0f; //添加四個邊陰影 imgvPhoto.layer.shadowColor = [UIColor blackColor].CGColor; imgvPhoto.layer.shadowOffset = CGSizeMake(0, 0); imgvPhoto.layer.shadowOpacity = 0.5; imgvPhoto.layer.shadowRadius = 10.0; //添加兩個邊陰影 imgvPhoto.layer.shadowColor = [UIColor blackColor].CGColor; imgvPhoto.layer.shadowOffset = CGSizeMake(4, 4); imgvPhoto.layer.shadowOpacity = 0.5; imgvPhoto.layer.shadowRadius = 2.0; [self.view addSubview:imgvPhoto]; // 添加手勢 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapImgView:)]; [imgvPhoto addGestureRecognizer:tap]; }
3. 截圖並修改圖片orm
/** * 截取當前屏幕 並修改 * * @return NSData * */ - (UIImage *)imageWithScreenshot { CGSize imageSize = CGSizeZero; UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; if (UIInterfaceOrientationIsPortrait(orientation)) imageSize = [UIScreen mainScreen].bounds.size; else imageSize = CGSizeMake([UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width); UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0); CGContextRef context = UIGraphicsGetCurrentContext(); for (UIWindow *window in [[UIApplication sharedApplication] windows]) { CGContextSaveGState(context); CGContextTranslateCTM(context, window.center.x, window.center.y); CGContextConcatCTM(context, window.transform); CGContextTranslateCTM(context, -window.bounds.size.width * window.layer.anchorPoint.x, -window.bounds.size.height * window.layer.anchorPoint.y); if (orientation == UIInterfaceOrientationLandscapeLeft) { CGContextRotateCTM(context, M_PI_2); CGContextTranslateCTM(context, 0, -imageSize.width); }else if (orientation == UIInterfaceOrientationLandscapeRight) { CGContextRotateCTM(context, -M_PI_2); CGContextTranslateCTM(context, -imageSize.height, 0); } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) { CGContextRotateCTM(context, M_PI); CGContextTranslateCTM(context, -imageSize.width, -imageSize.height); } if ([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) { [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES]; } else { [window.layer renderInContext:context]; } CGContextRestoreGState(context); } UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // 修改圖片 NSData *imageData = UIImagePNGRepresentation(image); UIImage *LastImage = [UIImage imageWithData:imageData]; UIImage *img = [UIImage imageNamed:@"ico_nursery.png"]; CGImageRef imgRef = img.CGImage; CGFloat w = CGImageGetWidth(imgRef); CGFloat h = CGImageGetHeight(imgRef); //以1.png的圖大小爲底圖 UIImage *img1 = LastImage; CGImageRef imgRef1 = img1.CGImage; CGFloat w1 = CGImageGetWidth(imgRef1); CGFloat h1 = CGImageGetHeight(imgRef1); //以1.png的圖大小爲畫布建立上下文 UIGraphicsBeginImageContext(CGSizeMake(w1, h1 + 100)); [img1 drawInRect:CGRectMake(0, 0, w1, h1)];//先把1.png 畫到上下文中 [img drawInRect:CGRectMake(10, h1 + 10, 80, 80)];//再把小圖放在上下文中 UIImage *resultImg = UIGraphicsGetImageFromCurrentImageContext();//從當前上下文中得到最終圖片 UIGraphicsEndImageContext();//關閉上下文 return resultImg; }
4.根據添加的事件進行分享 分享本身也可封裝server
// 點擊圖片改變imageView位置,打印圖片信息 分享本身也可封裝 - (void)tapImgView: (UITapGestureRecognizer *)tap { NSLog(@"點擊了圖片..."); // 微信 [MyAPIClient mobEvent:@"wechat"]; // [Helper shareImageName:_testImg type:SSDKPlatformSubTypeWechatSession];// 微信好友 [Helper shareImageName:_testImg type:SSDKPlatformSubTypeWechatTimeline];// 微信朋友圈 // QQ // [MyAPIClient mobEvent:@"QQ"]; // [Helper shareImageName:_testImg type:SSDKPlatformTypeQQ];// QQ }
5. 移除通知對象
- (void)dealloc { [[NSNotificationCenter defaultCenter]removeObserver:self]; }
這樣就能夠了.展現一下測試
自身截圖
截圖修改分享圖
ok,結束,須要補充的,歡迎你們留言討論!