【发布时间】:2016-04-23 19:18:17
【问题描述】:
我有一个UICOLLECTIONVIEW,即在选择任何图像时,我打开的完整图像视图。 打开完整图像工作正常,但一旦我关闭它,整个应用程序冻结超过 5 秒。我读到主线程可能过载,这可以解释延迟,但我不确定要移动到哪些线程以及移动到哪里,如果这是问题。
import UIKit
class FullImageViewController: UIViewController , UIScrollViewDelegate {
var scroller: UIScrollView!
var width = CGFloat()
var images = [Image]()
var imageArray = [UIImage]()
var imgs: [UIImage] = [UIImage(named: "pug7")!, UIImage(named: "pug6")!, UIImage(named: "pug7")!, UIImage(named: "pug6")!]
var index = Int()
var fullImagesAdded = Bool()
init(width: CGFloat, images: [Image], index: Int, imageArray: [UIImage]) {
super.init(nibName: nil, bundle: nil)
self.width = width
self.images = images
self.index = index
self.imageArray = imageArray
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
let downSwipe = UISwipeGestureRecognizer(target: self, action: #selector(FullImageViewController.swipeDown))
downSwipe.direction = .Down
view.addGestureRecognizer(downSwipe)
self.scroller = UIScrollView()
self.scroller.delegate = self
var i = 0
for img in images {
let aimageDetailViewController = ImageDetailViewController(index: self.index, image: img)
self.scroller.addSubview(aimageDetailViewController.view)
var aimageDetailViewFrame: CGRect = aimageDetailViewController.view.frame
aimageDetailViewFrame.origin.x = (super.view.frame.width) * CGFloat(i)
aimageDetailViewController.view.frame = aimageDetailViewFrame
i += 1
}
self.scroller.backgroundColor = UIColor.blackColor()
self.scroller.contentSize = CGSizeMake(self.view.frame.width * CGFloat(images.count), self.view.frame.height)
self.scroller.bounces = false
self.scroller.showsHorizontalScrollIndicator = false
self.scroller.setContentOffset(CGPoint(x: self.view.frame.width * CGFloat(index), y: 0), animated: false)
self.scroller.pagingEnabled = true
self.view.addSubview(scroller)
}
func swipeDown(){
dispatch_async(dispatch_get_main_queue()) {
self.dismissViewControllerAnimated(true, completion: nil)
}
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scroller.frame = view.bounds
}
}
这是我在 UICollectionView 中调用完整图像视图的地方:
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
let fullImage = FullImageViewController(width: CGFloat(imageURLSCache.count), images: imageURLSCache, index: Int(indexPath.row), imageArray: images)
self.presentViewController(fullImage, animated: true, completion: nil)
}
谢谢!
这是我用来下载完整图像视图和集合视图图像的扩展
extension UIImageView {
func downloadFrom(link link:String?, cache: NSCache ) {
image = UIImage(named: "logo")
self.alpha = 0.3
let data: NSData? = cache.objectForKey(link!) as? NSData
if let cachedData = data {
let image = UIImage(data: cachedData)
dispatch_async(dispatch_get_main_queue(), {() in
self.image = image
self.alpha = 1
images.append(self.image!)
})
return
}
if link != nil, let url = NSURL(string: link!) {
NSURLSession.sharedSession().dataTaskWithURL(url) { data, response, error in
guard let data = data where error == nil else {
print("\nerror on download \(error)")
return
}
if let httpResponse = response as? NSHTTPURLResponse where httpResponse.statusCode != 200 {
print("statusCode != 200; \(httpResponse.statusCode)")
return
}
dispatch_async(dispatch_get_main_queue()) {
print("\ndownload completed \(url.lastPathComponent!)")
self.image = UIImage(data: data)
self.alpha = 1
cache.setObject(data, forKey: link!)
}
}.resume()
} else {
dispatch_async(dispatch_get_main_queue(), {
self.image = UIImage(named: "logo")
})
}
}
}
【问题讨论】:
标签: swift uiviewcontroller uicollectionview