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。

你可能感兴趣的:(swift3.0 协议实现点击imageView放大缩小功能)