swift 放大缩小自定义 Scrollview
//
// ZoomScaleWithGestureScrollView.swift
// UIControlDemo
//
// Created by on 14/12/3.
// Copyright (c) 2014年 马大哈. All rights reserved.
// 协议
// 枚举类型
enum ImageLoadType {
case ImageNamed ,ImageBundle ,ImageDocument ,ImageUrl
}
protocol ZoomScaleDelegate{
func tapMethod()
}
import UIKit
class ZoomScaleWithGestureScrollView: UIScrollView ,UIScrollViewDelegate{
var imageView:UIImageView?
var deleZoom:ZoomScaleDelegate?
init(frame: CGRect ,loadType:ImageLoadType ,loadUrl:String) {
super.init(frame: frame)
delegate = self
minimumZoomScale = 0.5
maximumZoomScale = 2.0
showsHorizontalScrollIndicator = false
showsVerticalScrollIndicator = false
backgroundColor = .redColor()
imageView = UIImageView(frame: CGRectMake(0, 50, frame.size.width, frame.size.height))
imageView?.contentMode = UIViewContentMode.ScaleAspectFit
self.addSubview(imageView!)
imageView?.userInteractionEnabled = true
switch loadType {
case .ImageNamed:
imageView?.image = UIImage(named: loadUrl)
case .ImageBundle:
// "imageName.png" ----> imageName 和 png
let imageName = loadUrl.componentsSeparatedByString(".")
let imageBundle = NSBundle.mainBundle().pathForResource(imageName[0], ofType: imageName[1])
imageView?.image = UIImage(contentsOfFile: imageBundle!)
case .ImageDocument:
//传过来参数 文件夹 # 图片名字
let imageDocument = loadUrl.componentsSeparatedByString("#")
imageView?.image = UIImage(contentsOfFile: parseImageAddress(imageDocument[1], directory: imageDocument[0]))
case .ImageUrl:
// 用utf8 转义,防止中文路径无法读取 !表示一定存在
let loadString = loadUrl.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
let urlString = NSURL(string: loadString!)
let imageData = NSData(contentsOfURL: urlString!)
imageView?.image = UIImage(data: imageData!)
default :
println()
}
var gestureOne = UITapGestureRecognizer(target: self, action: "tapOne")
var gestureTwo = UITapGestureRecognizer(target: self, action: "tapTwo")
gestureTwo.numberOfTapsRequired = 2
gestureOne.requireGestureRecognizerToFail(gestureTwo)//加此代码防止双击动作调用单击方法(反之,两个方法都会调用)
imageView?.addGestureRecognizer(gestureOne)
imageView?.addGestureRecognizer(gestureTwo)
}
//”需要“初始化”init(编码器:)”的子类必须提供“UIScrollView”
//UIView采用NSCoding协议,需要一个init初始化器(编码器:)。所以你必须实现
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func tapTwo(){
var zoomF:CGFloat = self.zoomScale
if zoomF==1.0{
zoomF = 2.0
}else{
zoomF = 1.0
}
UIView.animateWithDuration(0.3, animations:{
self.zoomScale = zoomF
})
}
// 单击调用协议方法
func tapOne(){
deleZoom?.tapMethod()
}
func parseImageAddress(imageUrl: String ,directory:String) -> String{
var parserColon = imageUrl.stringByReplacingOccurrencesOfString(":", withString: "", options: .CaseInsensitiveSearch, range: nil)//替换 ---冒号
var parserHttp = parserColon.stringByReplacingOccurrencesOfString("http://", withString: "", options: .CaseInsensitiveSearch, range: nil)//替换 ---http://
var parserBias = parserHttp.stringByReplacingOccurrencesOfString("/", withString: "", options: .CaseInsensitiveSearch, range: nil)//替换 ---/
let application = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
let documentString = application[0] as String
var imageAddress = documentString.stringByAppendingPathComponent(parserBias)
if directory.isEmpty {
}else{
imageAddress = documentString.stringByAppendingPathComponent("\(directory)/\(parserBias)")
}
return imageAddress
}
func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
return imageView
}
func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView!, atScale scale: CGFloat) {
var zoomF = scrollView.zoomScale
zoomF = max(zoomF, 1.0);
zoomF = min(zoomF, 2.0)
UIView.animateWithDuration(0.3, animations:{
scrollView.zoomScale = zoomF
})
}
}
************************************************************************************************
调用方法 执行 ZoomScaleDelegate 协议 ,实现 tapMethod 协议方法
zoomScroll = ZoomScaleWithGestureScrollView(frame: CGRectMake(0, 0, self.view.frame.size.width, 300), loadType: ImageLoadType.ImageNamed, loadUrl: "test_DiamondInlay_goods_0.jpg")
// zoomScroll = ZoomScaleWithGestureScrollView(frame: CGRectMake(0, 0, self.view.frame.size.width, 300), loadType: ImageLoadType.ImageBundle, loadUrl: "test_DiamondInlay_goods_7.jpg")
// zoomScroll = ZoomScaleWithGestureScrollView(frame: CGRectMake(0, 0, self.view.frame.size.width, 300), loadType: ImageLoadType.ImageDocument, loadUrl: "imageFile#test_DiamondInlay_goods_1.jpg")//前面是文件夹,可为空
// zoomScroll = ZoomScaleWithGestureScrollView(frame: CGRectMake(0, 0, self.view.frame.size.width, 300), loadType: ImageLoadType.ImageUrl, loadUrl: "http://ww2.sinaimg.cn/bmiddle/632dab64jw1ehgcjf2rd5j20ak07w767.jpg")
zoomScroll?.deleZoom = self
self.view.addSubview(zoomScroll!)