外面只需要一行代碼就可以點(diǎn)擊查看大圖,再次點(diǎn)擊縮放放回原圖扳剿。
先定義一個(gè)顯示圖片的ShowHelper類(lèi)---本來(lái)想用struct的旁趟,但是貌似不支持添加手勢(shì),只有放棄了庇绽。锡搜。橙困。。耕餐。
我現(xiàn)在是能用struct就用struct凡傅,很少用class了,來(lái)看一下struct的優(yōu)點(diǎn)---swift.gg上面的
//放大圖片的時(shí)間
private let showBigDuration = 0.6
//縮放圖片的時(shí)間
private let showOriginalDuration = 0.6
class ShowHelper: NSObject {
/// 圖片imageView的原始frame
private static var originalFrame = CGRect()
private override init() {
super.init()
}
}
然后寫(xiě)一個(gè)extension----(為了干凈整潔蛾方,我定義類(lèi)/結(jié)構(gòu)體的時(shí)候,只寫(xiě)屬性)上陕,其它方法桩砰,我全部放在extension里面---只給外面提供一個(gè)show(imageView: UIImageView)方法,其它全部是private私有方法
extension ShowHelper {
//類(lèi)方法
class func show(imageView: UIImageView) {
imageView.userInteractionEnabled = true
let tap = UITapGestureRecognizer(target: self, action: #selector(showBigImage(_:)))
imageView.addGestureRecognizer(tap)
}
//private私有方法释簿。亚隅。。
@objc private class func showBigImage(sender: UITapGestureRecognizer) {
//swift里面我不喜歡用強(qiáng)制解析(!)----套用一句話----你每用一個(gè)庶溶!煮纵,就會(huì)殺死一只貓
//同時(shí)也為了去掉金字塔類(lèi)型的判斷。偏螺。行疏。我用guard / guard let來(lái)代替if/ if let
guard let imageV = sender.view as? UIImageView else {
fatalError("it is not UIImageView")
}
guard let image = imageV.image else {
return
}
guard let window = UIApplication.sharedApplication().delegate?.window else {
return
}
//originalFrame重新歸零
originalFrame = CGRect()
let oldFrame = imageV.convertRect(imageV.bounds, toView: window)
let backgroundView = UIView(frame: UIScreen.mainScreen().bounds)
backgroundView.backgroundColor = UIColor.blackColor()
backgroundView.alpha = 0.0
//賦值originalFrame
originalFrame = oldFrame
let newImageV = UIImageView(frame: oldFrame)
newImageV.contentMode = .ScaleAspectFit
newImageV.image = image
backgroundView.addSubview(newImageV)
window?.addSubview(backgroundView)
UIView.animateWithDuration(showBigDuration) {
let width = UIScreen.mainScreen().bounds.size.width
let height = image.size.height * width / image.size.width
let y = (UIScreen.mainScreen().bounds.size.height - image.size.height * width / image.size.width) * 0.5
newImageV.frame = CGRectMake(0, y, width, height)
backgroundView.alpha = 1
}
let tap2 = UITapGestureRecognizer(target: self, action: #selector(ShowHelper.showOriginal(_:)))
backgroundView.addGestureRecognizer(tap2)
}
//private私有方法。套像。酿联。
@objc private class func showOriginal(sender: UITapGestureRecognizer) {
guard let backgroundView = sender.view else {
return
}
guard let imageV = backgroundView.subviews.first else {
return
}
//大圖的frame變?yōu)樵瓉?lái)的frame,backgroundView的透明度為0夺巩,同時(shí)backgroundView從父視圖移除
UIView.animateWithDuration(showOriginalDuration, animations: {
imageV.frame = originalFrame
backgroundView.alpha = 0.0
}) { finished in
backgroundView.removeFromSuperview()
}
}
}