func viewPhotoDetalController(index: Int) -> PhotoDetailViewController? {
if let storyboard = storyboard,
detailController = storyboard.instantiateViewControllerWithIdentifier("PhotoDetail")
as? PhotoDetailViewController {
//loadPhoto()
return detailController
}
return nil
}
当在UIPageViewController
中向左或向右滑动时,上面的代码被调用,在返回detailController之前,我想加载照片并像这样设置detailController的photo变量
func loadPhoto (index:Int) {
let imgManager = PHCachingImageManager()
imgManager.requestImageForAsset(self.devicePhotosAsset[self.index] as! PHAsset, targetSize: PHImageManagerMaximumSize, contentMode: .AspectFit, options: nil, resultHandler: {(result, info) -> Void in
// set the detailController's photo here
})
}
但问题是,requestImageForAsset
是一个异步应用程序接口,当照片加载时,会返回detailController。另外,如果为requestImageForAsset
,则返回类型为空,因此我不能执行以下操作
imgManager.requestImageForAsset(self.devicePhotosAsset[self.index] as! PHAsset, targetSize: PHImageManagerMaximumSize, contentMode: .AspectFit, options: nil, resultHandler: {(result, info) -> Void in
detailController.photo = result
return detailController
})
那么如何设置detailController的photo变量呢?
这里是detailController的完整代码,我遵循UIScrollView教程here
import UIKit
import Photos
class PhotoDetailViewController : UIViewController {
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var imageViewBottomConstraint: NSLayoutConstraint!
@IBOutlet weak var imageViewLeadingConstraint: NSLayoutConstraint!
@IBOutlet weak var imageViewTopConstraint: NSLayoutConstraint!
@IBOutlet weak var imageViewTrailingConstraint: NSLayoutConstraint!
var devicePhotosAsset : PHFetchResult!
var index = 0
var photo : UIImage!
@IBOutlet weak var imageView : UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
self.displayPhoto()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
updateMinZoomScaleForSize(view.bounds.size)
}
func displayPhoto () {
let imgManager = PHCachingImageManager()
_ = imgManager.requestImageForAsset(self.devicePhotosAsset[self.index] as! PHAsset, targetSize: PHImageManagerMaximumSize, contentMode: .AspectFit, options: nil, resultHandler: {(result, info) -> Void in
self.imageView.image = result
})
}
private func updateMinZoomScaleForSize(size: CGSize) {
let widthScale = size.width / imageView.bounds.width
let heightScale = size.height / imageView.bounds.height
let minScale = min(widthScale, heightScale)
scrollView.minimumZoomScale = minScale
scrollView.zoomScale = minScale
}
private func updateConstraintsForSize(size: CGSize) {
let yOffset = max(0, (size.height - imageView.frame.height) / 2)
imageViewTopConstraint.constant = yOffset
imageViewBottomConstraint.constant = yOffset
let xOffset = max(0, (size.width - imageView.frame.width) / 2)
imageViewLeadingConstraint.constant = xOffset
imageViewTrailingConstraint.constant = xOffset
view.layoutIfNeeded()
}
}
extension PhotoDetailViewController: UIScrollViewDelegate {
func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
return imageView
}
func scrollViewDidZoom(scrollView: UIScrollView) {
updateConstraintsForSize(view.bounds.size)
}
}
发布于 2016-05-19 00:13:26
将PHAsset传递给PhotoDetailViewController,并在其viewdidload中调用以下载图像
imgManager.requestImageForAsset(phasset, targetSize: PHImageManagerMaximumSize, contentMode: .AspectFit, options: nil, resultHandler: {(result, info) -> Void in
self.photo = result
})
如果他们有什么问题,请告诉我
发布于 2016-06-01 12:21:30
尝试使用闭包当clouser捕获上下文中的变量和常量时,使用闭包可以解决以下问题: defined.So
func viewPhotoDetalController(index: Int) -> PhotoDetailViewController? {
if let storyboard = storyboard,
detailController = storyboard.instantiateViewControllerWithIdentifier("PhotoDetail")
as? PhotoDetailViewController {
loadPhoto(2, completionHandler: {[weak self] (image) in
detailController.imageView.image = image
})
return detailController
}
return nil
}
loadPhoto方法将如下所示
func loadPhoto(index:Int,completionHandler:(image:UIImage?)->()) {
let imgManager = PHCachingImageManager()
imgManager.requestImageForAsset(self.devicePhotosAsset[self.index] as! PHAsset, targetSize: PHImageManagerMaximumSize, contentMode: .AspectFit, options: nil, resultHandler: {(result, info) -> Void in
completionHandler(image: result)
})
}
https://stackoverflow.com/questions/37304721
复制相似问题