QMChatRoomShowImageController.m 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. //
  2. // QMChatRoomShowImageController.m
  3. // IMSDK-OC
  4. //
  5. // Created by haochongfeng on 2017/5/17.
  6. // Copyright © 2017年 HCF. All rights reserved.
  7. //
  8. #import "QMChatRoomShowImageController.h"
  9. @interface QMChatRoomShowImageController () <UIAlertViewDelegate,UINavigationControllerDelegate,UIScrollViewDelegate>
  10. @end
  11. @implementation QMChatRoomShowImageController
  12. - (void)viewDidLoad {
  13. [super viewDidLoad];
  14. self.view.backgroundColor = [UIColor blackColor];
  15. //bigImageView
  16. self.bigImageView = [[UIImageView alloc] init];
  17. self.bigImageView.contentMode = UIViewContentModeScaleAspectFit;
  18. if ([self.picType isEqualToString:@"0"]) {
  19. NSString * filePath = [NSString stringWithFormat:@"%@/%@/%@",NSHomeDirectory(),@"Documents",self.picName];
  20. self.bigImageView.image = [UIImage imageWithContentsOfFile:filePath];
  21. [self myInit];
  22. }else {
  23. [self.bigImageView sd_setImageWithURL:[NSURL URLWithString:self.picName] placeholderImage:self.image];
  24. [self.bigImageView sd_setImageWithURL:[NSURL URLWithString:self.picName] completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
  25. [self myInit];
  26. }];
  27. }
  28. }
  29. -(void)myInit{
  30. //sv
  31. UIScrollView *sv = [[UIScrollView alloc] initWithFrame:self.view.bounds];
  32. sv.minimumZoomScale = 1.0;
  33. sv.maximumZoomScale = 2.5;
  34. sv.delegate = self;
  35. [sv addSubview:self.bigImageView];
  36. [self.view addSubview:sv];
  37. //计算缩放scrollcontentVSize
  38. CGFloat rateK = kSize.width/kSize.height;
  39. if (self.bigImageView.image == nil) {
  40. return;
  41. }
  42. CGFloat rate = self.bigImageView.image.size.width/self.bigImageView.image.size.height;
  43. if (rate>rateK) {
  44. sv.contentSize = CGSizeMake(kSize.width, kSize.width/rate);
  45. self.bigImageView.frame = CGRectMake(0, 0, sv.contentSize.width, sv.contentSize.height);
  46. self.bigImageView.center = sv.center;
  47. }else{
  48. // sv.contentSize = CGSizeMake(kSize.width, kSize.width/rate);
  49. sv.contentSize = CGSizeMake(kSize.height*rate, kSize.height);
  50. self.bigImageView.frame = CGRectMake(0, 0, sv.contentSize.width, sv.contentSize.height);
  51. self.bigImageView.center = sv.center;
  52. }
  53. //手势单击
  54. UITapGestureRecognizer * gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapHandle:)];
  55. UILongPressGestureRecognizer * pressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)];
  56. [self.bigImageView addGestureRecognizer:pressGestureRecognizer];
  57. self.bigImageView.userInteractionEnabled = YES;
  58. [sv addGestureRecognizer:gestureRecognizer];
  59. //双击
  60. UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapHandle:)];
  61. doubleTap.numberOfTapsRequired = 2;
  62. //单机必须在双击手势识别失败时,才能识别
  63. [gestureRecognizer requireGestureRecognizerToFail:doubleTap];
  64. [sv addGestureRecognizer:doubleTap];
  65. }
  66. //长按保存图片
  67. - (void)longPressAction:(UILongPressGestureRecognizer *)pressGestureRecognizer {
  68. if (pressGestureRecognizer.state == UIGestureRecognizerStateBegan) {
  69. UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"保存图片" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
  70. [alertView show];
  71. }
  72. }
  73. //保存图片代理方法
  74. - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
  75. if (buttonIndex == 1) {
  76. if ([self.picType isEqualToString:@"0"]) {
  77. NSString * filePath = [NSString stringWithFormat:@"%@/%@/%@",NSHomeDirectory(),@"Documents",self.picName];
  78. UIImage *image = [UIImage imageWithContentsOfFile:filePath];
  79. UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
  80. }else {
  81. NSURL * url = [NSURL URLWithString:self.picName];
  82. NSURLRequest * request = [NSURLRequest requestWithURL:url];
  83. NSOperationQueue * queue = [[NSOperationQueue alloc] init];
  84. [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
  85. UIImageWriteToSavedPhotosAlbum([UIImage imageWithData:data], self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
  86. }];
  87. }
  88. }
  89. }
  90. - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
  91. {
  92. if (!error) {
  93. ShowMsg(@"已保存到系统相册");
  94. }else{
  95. NSLog(@"image = %@, error = %@, contextInfo = %@", image, error, contextInfo);
  96. }
  97. }
  98. - (void)tapHandle:(UITapGestureRecognizer *)tap{
  99. if (tap.numberOfTapsRequired == 1) {
  100. [self dismissViewControllerAnimated:true completion:nil];
  101. } else if (tap.numberOfTapsRequired == 2) {
  102. UIScrollView *sv = (UIScrollView *)tap.view;
  103. if (sv.zoomScale != 1.0) {
  104. [sv setZoomScale:1.0 animated:YES];
  105. } else {
  106. CGPoint touchPoint = [tap locationInView:self.bigImageView];
  107. CGFloat newZoomScale = sv.maximumZoomScale;
  108. CGFloat xsize = self.view.frame.size.width / newZoomScale;
  109. CGFloat ysize = self.view.frame.size.height / newZoomScale;
  110. [sv zoomToRect:CGRectMake(touchPoint.x - xsize/2, touchPoint.y - ysize/2, xsize, ysize) animated:YES];
  111. }
  112. }
  113. }
  114. #pragma mark - sv代理
  115. - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
  116. {
  117. return self.bigImageView;
  118. }
  119. - (void)scrollViewDidZoom:(UIScrollView *)scrollView {
  120. CGFloat offsetX = (scrollView.frame.size.width > scrollView.contentSize.width) ? ((scrollView.frame.size.width - scrollView.contentSize.width) * 0.5) : 0.0;
  121. CGFloat offsetY = (scrollView.frame.size.height > scrollView.contentSize.height) ? ((scrollView.frame.size.height - scrollView.contentSize.height) * 0.5) : 0.0;
  122. self.bigImageView.center = CGPointMake(scrollView.contentSize.width * 0.5 + offsetX, scrollView.contentSize.height * 0.5 + offsetY);
  123. }
  124. - (void)didReceiveMemoryWarning {
  125. [super didReceiveMemoryWarning];
  126. // Dispose of any resources that can be recreated.
  127. }
  128. @end