美文网首页iOS Developer
swift3.0 协议实现点击imageView放大缩小功能

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

作者: FaiChou | 来源:发表于2017-07-21 12:34 被阅读479次

    效果😋

    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放大缩小功能

        本文链接:https://www.haomeiwen.com/subject/gposkxtx.html