2016-05-18 82 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) 
    }) 
}