swift3.0 协议实现点击imageView放大缩小功能

效果😋

Jietu20170721-112203-HD.gif

code😎

import UIKit
class PhotoViewerController: UIViewController, ImageViewTapSolveDelegate {
  @IBOutlet weak var space1ImageView: UIImageView!
  @IBOutlet weak var space2ImageView: UIImageView!
  @IBOutlet weak var space3ImageView: UIImageView!
  override func viewDidLoad() {
    super.viewDidLoad()
    [space1ImageView, space2ImageView, space3ImageView].forEach { [weak self] (iv) in
      let tap = UITapGestureRecognizer(target: self, action: #selector(self?.handleTap(_:)))
      iv?.addTapper(tap)
      iv?.soleveTapDelegate = self
    }
  }
  func handleTap(_ tap: UITapGestureRecognizer) {
    soleveTap(on: tap.view as! UIImageView)
  }
}

三张图片放到stackview上,点击图片,放大图片到superview大小,再次点击,缩回到原来尺寸。将imageview添加tapgesturerecognizer,再将soleveTapDelegate添加上,此代理方法有默认实现solveTap()。需要在运行时将UIImageView添加soleveTapDelegate方法。

import UIKit

public struct ImageViewEnlargeHelper {
  var origenFrame: CGRect
  var superViewFrame: CGRect
  var isBigSize: Bool
  init(imageView: UIImageView) {
    origenFrame = imageView.frame
    superViewFrame = imageView.superview!.bounds
    isBigSize = false
  }
}
var AssociatedObjectHandle1: UInt8 = 0
var AssociatedObjectHandle2: UInt8 = 0
extension UIImageView {
  var enlargeHelper: ImageViewEnlargeHelper? {
    get {
      return objc_getAssociatedObject(self, &AssociatedObjectHandle1)
        as? ImageViewEnlargeHelper
    }
    set {
      objc_setAssociatedObject(self,
                               &AssociatedObjectHandle1,
                               newValue,
                               .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }
  }
  func addTapper(_ tap: UITapGestureRecognizer) {
    self.isUserInteractionEnabled = true
    self.addGestureRecognizer(tap)
    self.enlargeHelper = ImageViewEnlargeHelper(imageView: self)
  }
}
protocol ImageViewTapSolveDelegate {}
extension ImageViewTapSolveDelegate  {
  func soleveTap(on imageView: UIImageView) {
    imageView.superview?.bringSubview(toFront: imageView)
    imageView.superview?.layoutIfNeeded()
    if !imageView.enlargeHelper!.isBigSize {
      UIView.animate(withDuration: 0.5, animations: {
        imageView.frame = imageView.enlargeHelper!.superViewFrame
      }, completion: { (f) in
        imageView.enlargeHelper!.isBigSize = true
      })
    } else {
      UIView.animate(withDuration: 0.5, animations: {
        imageView.frame = imageView.enlargeHelper!.origenFrame
      }, completion: { (f) in
        imageView.enlargeHelper!.isBigSize = false
      })
    }
  }
}
extension UIImageView {
  var soleveTapDelegate: ImageViewTapSolveDelegate? {
    get {
      return objc_getAssociatedObject(self, &AssociatedObjectHandle2)
        as? ImageViewTapSolveDelegate
    }
    set {
      objc_setAssociatedObject(self,
                               &AssociatedObjectHandle2,
                               newValue,
                               .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }
  }
}

使用ImageViewEnlargeHelper来简化小逻辑,使整个框架更testable。当然也需要在运行时将UIImageView绑定enlargeHelper。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容