ios cassni app主要用到了以下内容:
- scrollview的使用
- 闭包的使用
- 多线程的使用
scrollview的使用
使用scrollview包住原来的view即可,需要控制contensize,如果需要缩放,还需要添加最大与最小缩放范围。
添加ScrollView
1.设置其滑动区域(最大可显示区域) scrollView. contentSize = CGSize(width: 3000, height:2000)
2.设置位置及大小 logo.frame = CGRect(x:2700, y:50, width:120, height: 180)
3.添加 scrollView.addSubview(logo)
获取正在显示的区域
利用ScrollView的contentOffset属性即可 let upperLeftOfVisible:CGPoint = scrollView.contentOffset
zoom in 放大/缩小ScrollView也可以进行放大和缩小
1.设置代理,实现viewForZoomingInScrollView方法 func viewForZoomingInScrollView(sender: UIScrollView) -> UIView
2.设置zoom in的最大值和最小值 ScrollView.minimumZoomScale = 0.5 //最小缩小为原来的1/2
ScrollView.maxmumZoomScale = 2.0 //最大放大到原来的2倍
3.利用代码进行缩放设置
var zoomScale: CGFloat
func setZoomScale(CGFloat, animated: Bool)
func zoomToRect(CGRect, animated: Bool)
闭包的使用
多线程的使用
Queues
在iOS里有多重队列,每个队列就相当于一个函数队列,基础的闭包在等待运行.每个队列都有一个自己的线程去运行这些队列、去处理队列里的东西.这造就了多线程环境
Main Queue
1.Main Queue是什么?
主队列是一个串行队列,这说明主队列依次从队列里拉出一个函数.它从来不会同一时间运行两个函数.所有的UI活动都必须发生在主队列.
2.如何获得Main Queue
let mainQ: dispatch_queue_t = dispatch_get_main_queue()
let mainQ: NSOperationQueue = NSOperationQueue.mainQueue()
//以上两种方法都可获得Main Queue
dispatch_async(notTheMainQueue) {
//此处跳出主队列,获取其他队列,在此一般添加一些不阻塞UI的代码,如DEMO中的加载URL,已实现程序的顺畅运行
dispatch_async(dispatch_get_main_queue()) {
//返回主队列,此时已经完成了上面对URL的加载,这时再来更新UI
}
}
Other Queues 如何获得
1.向系统申请一个恰当的service来获取队列
QOS_CLASS_USER_INTERACTIVE //最高优先级,立即执行
QOS_CLASS_USER_INITIATED //优先级较高,但加载会占用较长时间
QOS_CLASS_UTILITY //较低优先级
QOS_CLASS_BACKGROUND //最低优先级,可在后台进行处理,与用户的操作无关
let qos = Int(以上四个QOS的其中之一.rawValue)
2.创建队列
let queue = dispatch_get_global_queue(qos,0)
3.进行队列的操作,实现代码即可
CassiniDemo
import UIKit
class ImageViewController: UIViewController,UIScrollViewDelegate {
var imageURL : NSURL?{
didSet{
image=nil
if view.window != nil{
fetchImage()
}
}
}
func fetchImage(){
if let url=imageURL{
spinner?.startAnimating()
let qos = Int (QOS_CLASS_USER_INTERACTIVE.rawValue)
dispatch_async(dispatch_get_global_queue(qos, 0), { () -> Void in
let imageData=NSData(contentsOfURL:url )
dispatch_async(dispatch_get_main_queue()){
if url == self.imageURL{
if imageData != nil{
self.image = UIImage(data: imageData!)
}else{
self.image=nil
}
}
}
})
}
}
func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
return imageView
}
private var imageView=UIImageView()
@IBOutlet weak var scrollView: UIScrollView!{
didSet{
scrollView.contentSize = imageView.frame.size
scrollView.delegate=self
scrollView.minimumZoomScale=0.03
scrollView.maximumZoomScale=1.0
}
}
@IBOutlet weak var spinner: UIActivityIndicatorView!
private var image:UIImage?{
get{
return imageView.image
}
set{
imageView.image=newValue
imageView.sizeToFit()
scrollView?.contentSize = imageView.frame.size
spinner?.stopAnimating()
}
}
override func viewDidLoad() {
super.viewDidLoad()
scrollView.addSubview(imageView)
// if image == nil{
// imageURL = DemoURL.Stanford
// }
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if image == nil{
fetchImage()
}
}
}