SLImageZoomView.m 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. //
  2. // SLScrollView.m
  3. //
  4. // Created by wsl on 2019/10/27.
  5. // Copyright © 2019 wsl. All rights reserved.
  6. //
  7. #import "SLImageZoomView.h"
  8. @interface SLImageZoomView ()<UIScrollViewDelegate>
  9. /// 是否正在移动或缩放
  10. @property (nonatomic, assign) BOOL isMoving;
  11. @end
  12. @implementation SLImageZoomView
  13. #pragma mark - Override
  14. - (instancetype)initWithFrame:(CGRect)frame {
  15. self = [super initWithFrame:frame];
  16. if (self) {
  17. self.delegate = self;
  18. self.clipsToBounds = NO;
  19. if (@available(iOS 11.0, *)) {
  20. self.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
  21. } else {
  22. // Fallback on earlier versions
  23. }
  24. self.maximumZoomScale = MAXFLOAT;
  25. self.minimumZoomScale = 1;
  26. self.showsVerticalScrollIndicator = NO;
  27. self.showsHorizontalScrollIndicator = NO;
  28. [self setupUI];
  29. }
  30. return self;
  31. }
  32. //超出bounce范围,依然可以触发事件
  33. - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
  34. BOOL inside = [super pointInside:point withEvent:event];
  35. if (CGRectContainsPoint(self.imageView.frame, point)) {
  36. inside = YES;
  37. }
  38. return inside;;
  39. }
  40. #pragma mark - UI
  41. - (void)setupUI {
  42. [self addSubview:self.imageView];
  43. }
  44. #pragma mark - Getter
  45. - (UIImageView *)imageView {
  46. if (!_imageView) {
  47. _imageView = [[UIImageView alloc] initWithFrame:self.bounds];
  48. // _imageView.contentMode = UIViewContentModeScaleAspectFit;
  49. _imageView.userInteractionEnabled = YES;
  50. }
  51. return _imageView;
  52. }
  53. - (BOOL)isMoving {
  54. if (!self.isDecelerating && !self.isZooming && !self.isZoomBouncing && !self.isDragging) {
  55. return YES;
  56. }else {
  57. return NO;
  58. }
  59. }
  60. #pragma mark - Setter
  61. - (void)setImage:(UIImage *)image {
  62. _image = image;
  63. self.imageView.image = image;
  64. }
  65. #pragma mark - UIScrollViewDelegate
  66. - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
  67. }
  68. - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
  69. if (!self.isMoving) {
  70. if ([self.zoomViewDelegate respondsToSelector:@selector(zoomViewDidBeginMoveImage:)]) {
  71. [self.zoomViewDelegate zoomViewDidBeginMoveImage:self];
  72. }
  73. }
  74. }
  75. - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
  76. if (!decelerate) {
  77. if (self.isMoving ) {
  78. if ([self.zoomViewDelegate respondsToSelector:@selector(zoomViewDidEndMoveImage:)]) {
  79. [self.zoomViewDelegate zoomViewDidEndMoveImage:self];
  80. }
  81. }
  82. }
  83. }
  84. //结束减速
  85. - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
  86. if (self.isMoving ) {
  87. if ([self.zoomViewDelegate respondsToSelector:@selector(zoomViewDidEndMoveImage:)]) {
  88. [self.zoomViewDelegate zoomViewDidEndMoveImage:self];
  89. }
  90. }
  91. }
  92. //返回缩放视图
  93. - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
  94. return self.imageView;
  95. }
  96. //开始缩放
  97. - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view{
  98. if (!self.isMoving) {
  99. if ([self.zoomViewDelegate respondsToSelector:@selector(zoomViewDidBeginMoveImage:)]) {
  100. [self.zoomViewDelegate zoomViewDidBeginMoveImage:self];
  101. }
  102. }
  103. }
  104. //结束缩放
  105. - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale{
  106. if (self.isMoving ) {
  107. if ([self.zoomViewDelegate respondsToSelector:@selector(zoomViewDidEndMoveImage:)]) {
  108. [self.zoomViewDelegate zoomViewDidEndMoveImage:self];
  109. }
  110. }
  111. }
  112. //缩放中
  113. - (void)scrollViewDidZoom:(UIScrollView *)scrollView {
  114. if (scrollView.isZooming || scrollView.isZoomBouncing) {
  115. // 延中心点缩放
  116. CGRect rect = CGRectApplyAffineTransform(scrollView.frame, scrollView.transform);
  117. CGFloat offsetX = (rect.size.width > scrollView.contentSize.width) ? ((rect.size.width - scrollView.contentSize.width) * 0.5) : 0.0;
  118. CGFloat offsetY = (rect.size.height > scrollView.contentSize.height) ? ((rect.size.height - scrollView.contentSize.height) * 0.5) : 0.0;
  119. self.imageView.center = CGPointMake(scrollView.contentSize.width * 0.5 + offsetX, scrollView.contentSize.height * 0.5 + offsetY);
  120. }
  121. }
  122. @end