2016-05-18 2 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 как этоКак загрузить изображение в ИО 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) 
    }) 
} 
Смежные вопросы