IHShowHelper.swift 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. //
  2. // IHShowHelper.swift
  3. // Inhealth
  4. //
  5. // Created by weclouds on 2020/1/14.
  6. // Copyright © 2020 weclouds. All rights reserved.
  7. //
  8. import UIKit
  9. //放大图片的时间
  10. private let showBigDuration = 0.6
  11. //缩放图片的时间
  12. private let showOriginalDuration = 0.6
  13. class IHShowHelper: NSObject {
  14. /// 图片imageView的原始frame
  15. private static var originalFrame = CGRect()
  16. private override init() {
  17. super.init()
  18. }
  19. deinit {
  20. log.debug("IHShowHelper销毁")
  21. }
  22. }
  23. extension IHShowHelper {
  24. //类方法
  25. class func show(imageView: UIImageView) {
  26. imageView.isUserInteractionEnabled = true
  27. let tap = UITapGestureRecognizer(target: self, action: #selector(showBigImage(sender:)))//showBigImage(_:)
  28. imageView.addGestureRecognizer(tap)
  29. }
  30. //private私有方法。。。
  31. @objc private class func showBigImage(sender: UITapGestureRecognizer) {
  32. //swift里面我不喜欢用强制解析(!)----套用一句话----你每用一个!,就会杀死一只猫
  33. //同时也为了去掉金字塔类型的判断。。。我用guard / guard let来代替if/ if let
  34. guard let imageV = sender.view as? UIImageView else {
  35. fatalError("it is not UIImageView")
  36. }
  37. guard let image = imageV.image else {
  38. return
  39. }
  40. guard let window = UIApplication.shared.keyWindow else {
  41. return
  42. }
  43. //originalFrame重新归零
  44. IHShowHelper.originalFrame = CGRect()
  45. let oldFrame = imageV.convert(imageV.bounds, to: window)
  46. let backgroundView = UIView(frame: UIScreen.main.bounds)
  47. backgroundView.backgroundColor = UIColor.black
  48. backgroundView.alpha = 0.0
  49. //赋值originalFrame
  50. IHShowHelper.originalFrame = oldFrame
  51. let newImageV = UIImageView(frame: oldFrame)
  52. newImageV.contentMode = .scaleAspectFit
  53. newImageV.image = image
  54. backgroundView.addSubview(newImageV)
  55. window.addSubview(backgroundView)
  56. UIView.animate(withDuration: showBigDuration) {
  57. let width = UIScreen.main.bounds.size.width
  58. let height = image.size.height * width / image.size.width
  59. let y = (UIScreen.main.bounds.size.height - image.size.height * width / image.size.width) * 0.5
  60. newImageV.frame = CGRect(x: 0,y: y,width: width,height: height)
  61. backgroundView.alpha = 1
  62. }
  63. let tap2 = UITapGestureRecognizer(target: self, action: #selector(IHShowHelper.showOriginal(sender:)))//showOriginal(_:)
  64. backgroundView.addGestureRecognizer(tap2)
  65. }
  66. //private私有方法。。。
  67. @objc private class func showOriginal(sender: UITapGestureRecognizer) {
  68. guard let backgroundView = sender.view else {
  69. return
  70. }
  71. guard let imageV = backgroundView.subviews.first else {
  72. return
  73. }
  74. //大图的frame变为原来的frame,backgroundView的透明度为0,同时backgroundView从父视图移除
  75. UIView.animate(withDuration: showOriginalDuration, animations: {
  76. imageV.frame = IHShowHelper.originalFrame
  77. backgroundView.alpha = 0.0
  78. }) { finished in
  79. backgroundView.removeFromSuperview()
  80. }
  81. }
  82. }