首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在ios UIPageViewController中加载镜像

如何在ios UIPageViewController中加载镜像
EN

Stack Overflow用户
提问于 2016-05-19 00:01:21
回答 2查看 482关注 0票数 0
代码语言:javascript
运行
复制
func viewPhotoDetalController(index: Int) -> PhotoDetailViewController? {
    if let storyboard = storyboard,
        detailController = storyboard.instantiateViewControllerWithIdentifier("PhotoDetail")
            as? PhotoDetailViewController {
        //loadPhoto()
        return detailController
    }
    return nil
}

当在UIPageViewController中向左或向右滑动时,上面的代码被调用,在返回detailController之前,我想加载照片并像这样设置detailController的photo变量

代码语言:javascript
运行
复制
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,则返回类型为空,因此我不能执行以下操作

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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)
 }

}
EN

回答 2

Stack Overflow用户

发布于 2016-05-19 00:13:26

将PHAsset传递给PhotoDetailViewController,并在其viewdidload中调用以下载图像

代码语言:javascript
运行
复制
 imgManager.requestImageForAsset(phasset, targetSize: PHImageManagerMaximumSize, contentMode: .AspectFit, options: nil, resultHandler: {(result, info) -> Void in
                self.photo = result

            })

如果他们有什么问题,请告诉我

票数 0
EN

Stack Overflow用户

发布于 2016-06-01 12:21:30

尝试使用闭包当clouser捕获上下文中的变量和常量时,使用闭包可以解决以下问题: defined.So

代码语言:javascript
运行
复制
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方法将如下所示

代码语言:javascript
运行
复制
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)
    })
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37304721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档