效果😋

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。
网友评论