Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 异步加载内容时如何设置UIScrollView上下文化_Ios_Uiscrollview_Uiimageview_Contentsize - Fatal编程技术网

Ios 异步加载内容时如何设置UIScrollView上下文化

Ios 异步加载内容时如何设置UIScrollView上下文化,ios,uiscrollview,uiimageview,contentsize,Ios,Uiscrollview,Uiimageview,Contentsize,我的视图层次结构是这样的 PhotoDetailViewController.swift View UIScrollView UIImageView 我使用故事板进行设置,并向UIScrollView添加四个约束(顶部=0,底部=0,前导=0,尾随=0),向UIImageView添加四个约束(顶部=0,底部=0,前导=0,尾随=0),但有两个错误提示 "ScrollView has ambiguous scrollable content width" "

我的视图层次结构是这样的

PhotoDetailViewController.swift

    View
      UIScrollView
        UIImageView
我使用故事板进行设置,并向UIScrollView添加四个约束(顶部=0,底部=0,前导=0,尾随=0),向UIImageView添加四个约束(顶部=0,底部=0,前导=0,尾随=0),但有两个错误提示

"ScrollView has ambiguous scrollable content width"
"ScrollView has ambiguous scrollable content height"
我知道这是因为我没有设置UIScrollView contentSize,但我尝试从PHAsset异步加载照片,所以我只能在运行时获取照片大小。因此,问题是:

1:鉴于照片大小只能在运行时获取,如何解决“不明确的可滚动内容”错误

2:我应该在哪个视图的生命周期方法中调用PHImageManager.requestImageForAsset?因为我认为我应该以编程方式设置UIScrollView contentSize,但是什么时候

使用PhotoDetailViewController.swift更新

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!
var imgManager:PHImageManager!

@IBOutlet weak var imageView : UIImageView!

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
}

override func awakeFromNib() {
    self.imgManager = PHImageManager()
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.displayPhoto()
}

override func viewWillLayoutSubviews() {
    super.viewDidLayoutSubviews()
    updateMinZoomScaleForSize()
    updateConstraintsForSize()
}

func displayPhoto () {
    _ = self.imgManager.requestImageForAsset(self.devicePhotosAsset[self.index] as! PHAsset, targetSize: PHImageManagerMaximumSize, contentMode: .AspectFit, options: nil, resultHandler: {(result, info) -> Void in
            NSOperationQueue.mainQueue().addOperationWithBlock(){
                self.imageView.image = result
            }

        })
}

private func targetSize() -> CGSize {
    let scale = UIScreen.mainScreen().scale
    let targetSize = CGSizeMake(CGRectGetWidth(self.imageView.bounds)*scale, CGRectGetHeight(self.imageView.bounds)*scale)

    return targetSize
}

private func updateMinZoomScaleForSize() {
    let size = scrollView.bounds.size
    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
}

func recenterImage(){
    let scrollViewSize = scrollView.bounds.size
    let imageSize = imageView.frame.size

    let horizontalSpace = imageSize.width < scrollViewSize.width ? (scrollViewSize.width - imageSize.width)/2 : 0
    let verticalSpace = imageSize.height < scrollViewSize.height ? (scrollViewSize.height - imageSize.height)/2 : 0
    scrollView.contentInset = UIEdgeInsets(top: verticalSpace, left: horizontalSpace, bottom: verticalSpace, right: horizontalSpace)
}

private func updateConstraintsForSize() {
    let size = scrollView.bounds.size
    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()
}
}
导入UIKit
导入照片
类PhotoDetailViewController:UIViewController{
@iBCROLLVIEW:UIScrollView!
@IBOutlet弱var imageViewBottomConstraint:NSLayoutConstraint!
@IBOutlet弱var imageViewLeadingConstraint:NSLayoutConstraint!
@IBOutlet弱var imageViewTopConstraint:NSLayoutConstraint!
@IBOutlet弱var imageViewTrailingConstraint:NSLayoutConstraint!
var devicePhotosAsset:PHFetchResult!
var指数=0
图片:UIImage!
var imgManager:PHImageManager!
@IBVAR imageView:UIImageView!
覆盖功能视图将出现(动画:Bool){
超级。视图将显示(动画)
}
重写func awakeFromNib(){
self.imgManager=PHImageManager()
}
重写func viewDidLoad(){
super.viewDidLoad()
self.displayPhoto()
}
重写func viewWillLayoutSubviews(){
super.viewDidLayoutSubviews()
updateMinZoomScaleForSize()
updateConstraintsForSize()
}
func displayPhoto(){
_=self.imgManager.requestImageForAsset(self.DevicePhotoAsset[self.index]as!PHAsset,targetSize:PHImageManagerMaximumSize,contentMode:.AspectFit,选项:nil,resultHandler:{(结果,信息)->Void in
NSOperationQueue.mainQueue().addOperationWithBlock(){
self.imageView.image=结果
}
})
}
private func targetSize()->CGSize{
让scale=UIScreen.mainScreen().scale
设targetSize=CGSizeMake(CGRectGetWidth(self.imageView.bounds)*比例,CGRectGetHeight(self.imageView.bounds)*比例)
返回目标大小
}
私有函数updateMiniZoomScaleForSize(){
让大小=scrollView.bounds.size
设widthScale=size.width/imageView.bounds.width
让heightScale=size.height/imageView.bounds.height
设最小刻度=最小(宽度刻度、高度刻度)
scrollView.minimumZoomScale=minScale
scrollView.zoomScale=最小刻度
}
函数重新居中映像(){
让scrollViewSize=scrollView.bounds.size
设imageSize=imageView.frame.size
让horizontalSpace=imageSize.widthUIView{
返回图像视图
}
func scrollViewDidZoom(scrollView:UIScrollView){
updateConstraintsForSize()
}
}

获取数据后,只需添加以下行即可

float sizeOfContent = 0;
UIView *lLast = [yourscrollview.subviews lastObject];
NSInteger wd = lLast.frame.origin.y;
NSInteger ht = lLast.frame.size.height;
sizeOfContent = wd+ht;
yourscrollview.contentSize = CGSizeMake(yourscrollview.frame.size.width, sizeOfContent);

希望这有帮助

您应该为
图像视图设置两个约束

  • 水平放置在容器中(也可以说它位于X中心)
  • 固定高度
  • 第二件事,你可以把
    UIView
    放在
    Scrollview
    上,约束条件如下:,
    顶部、前导、尾随、底部、水平放置在容器中(中心x),固定高度)。

    然后将imageview添加到该视图中。并且可以在获得图像后更改其约束,以调整其高度和宽度


    您可以连接任何约束的
    outlet
    ,并可以通过编程方式更改其常量。

    您现有的约束足以设置内容大小,只是它基于图像视图固有的内容大小,在图像视图具有图像之前,它并不真正存在


    可以使用默认值向图像视图添加宽度和高度约束,并在将图像设置为视图时停用这些约束。或者,您可以使用占位符图像并避免这些额外的约束,因为图像视图始终具有固有的内容大小。

    Xcode UI builder为此类情况提供了特殊类型的约束(当您只能在运行时设置约束时)。这就是所谓的“占位符约束”,它将在构建时删除,但有助于删除开发错误的约束

    所以解决办法是

  • 添加一些示例约束并将其标记为占位符
  • 在运行时添加所需的约束

  • 您的意思是以编程方式添加ImageView吗?您可以以编程方式或从interface builder添加。如果您是从interface builder添加它的,那么您应该在从库或数据库或其他地方获取图像后,使用您想要更改的所需约束的出口来调整它的大小!我使用scroll view的原因是因为我想实现照片缩放效果,所以我将每个imageview约束连接到控制器,并在照片加载时更新约束值,但这似乎不起作用请查看更新有关