2016-05-18 37 views
0
func viewPhotoDetalController(index: Int) -> PhotoDetailViewController? { 
    if let storyboard = storyboard, 
     detailController = storyboard.instantiateViewControllerWithIdentifier("PhotoDetail") 
      as? PhotoDetailViewController { 
     //loadPhoto() 
     return detailController 
    } 
    return nil 
} 

离开时刷卡或向右UIPageViewController上面的代码中被调用, 之前返回detailController我要加载的照片,并设置detailController的照片变这样如何加载图像在IOS UIPageViewController

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是一个异步的api,由照片加载的时候返回detailController。也requestImageForAsset API的返回类型,如果无效,所以我不能做这样的事情

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的照片变量?

这里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) 
} 

} 
+0

你为什么不执行DetailViewController内的图像加载逻辑? –

回答

0

传递PHAsset到PhotoDetailViewController并在其viewDidLoad中拨打电话下载图像

imgManager.requestImageForAsset(phasset, targetSize: PHImageManagerMaximumSize, contentMode: .AspectFit, options: nil, resultHandler: {(result, info) -> Void in 
       self.photo = result 

      }) 

如果他们是任何问题让我知道

+0

这将无法正常工作,必须在页面控制器中加载照片 – paynestrike

+0

为什么无法在viewdidload中加载? –

+0

它会工作,但详细控制器我使用scrollView使图像可缩放,在这里加载图像会导致初始照片比例非常大 – paynestrike

0

尝试使用闭包作为clouser捕获con的变量和常量文本 - 它是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) 
    }) 
}