iOS截圖後仿今日頭條實現一鍵分享
阿新 • • 發佈:2018-12-30
實現如上圖效果
1,監聽截圖產生事件
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(userDidTakeScreenshot:)
name:UIApplicationUserDidTakeScreenshotNotification object:nil];
2,獲取擷取到的圖片
//返回擷取到的圖片
- (UIImage *)imageWithScreenshot
{
NSData *imageData = [self dataWithScreenshotInPNGFormat];
return [UIImage imageWithData:imageData];
}
//擷取當前螢幕
- (NSData *)dataWithScreenshotInPNGFormat
{
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();
return UIImagePNGRepresentation(image);
}
3,實現漂浮View的程式碼
- (void)userDidTakeScreenshot:(NSNotification *)notification
{
UIView *view = [[UIView alloc] init];
view.backgroundColor = H_GREENCOLOR;
view.layer.cornerRadius = 4;
view.clipsToBounds = YES;
[self.window addSubview:view];
_screenImage = [self imageWithScreenshot];
//新增顯示
UIImageView *imgvPhoto = [[UIImageView alloc]initWithImage:_screenImage];
[view addSubview:imgvPhoto];
UILabel *lab = [[UILabel alloc] init];
lab.text = @"一鍵分享";
lab.textAlignment = NSTextAlignmentCenter;
lab.font = H_FONT10;
lab.textColor = [UIColor whiteColor];
[view addSubview:lab];
[view mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self.window.mas_right).mas_offset(-15);
make.centerY.mas_equalTo(self.window.mas_centerY);
make.width.mas_equalTo(ScreenWidth/5+4);
make.height.mas_equalTo(ScreenHeight/5+20);
}];
[imgvPhoto mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(view.mas_left).mas_offset(2);
make.right.equalTo(view.mas_right).mas_offset(-2);
make.top.mas_equalTo(view.mas_top).mas_offset(2);
make.height.mas_equalTo(ScreenHeight/5);
}];
[lab mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(view.mas_left).mas_offset(0);
make.right.equalTo(view.mas_right).mas_offset(0);
make.top.mas_equalTo(imgvPhoto.mas_bottom).mas_offset(0);
make.bottom.mas_equalTo(view.mas_bottom).mas_offset(0);
}];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapClick:)];
[view addGestureRecognizer:tap];
[self performSelector:@selector(delayMethod:) withObject:view/*可傳任意型別引數*/ afterDelay:3.0];
}
4,3秒之後view消失
- (void)delayMethod:(UIView *)view
{
[UIView animateWithDuration:2 animations:^{
} completion:^(BOOL finished) {
[view removeFromSuperview];
}];
}
5,tap點選事件
- (void)tapClick:(UIGestureRecognizer *)tap
{
//實現相應功能
}