thứ bậc Quan điểm của tôi là thế nàyLàm thế nào để thiết lập UIScrollView contensize khi nội dung là tải không đồng bộ
PhotoDetailViewController.swift
View
UIScrollView
UIImageView
tôi thiết lập này bằng cách sử dụng kịch bản, và bổ sung bốn trở ngại (top = 0, đáy = 0, dẫn = 0, tailing = 0) để UIScrollView, bốn trở ngại (top = 0, đáy = 0, dẫn = 0, tailing = 0) để UIImageView, nhưng có hai lỗi nói
"ScrollView has ambiguous scrollable content width"
"ScrollView has ambiguous scrollable content height"
tôi hiểu rằng đây là vì tôi thiên đường' t đặt UIScrollView contentSize, nhưng những gì tôi cố gắng làm là tải ảnh từ PHAsset một cách không đồng bộ, vì vậy tôi chỉ có thể nhận được kích thước ảnh trong thời gian chạy. Vì vậy, câu hỏi là:
1: Cho rằng kích thước ảnh chỉ có thể đạt được khi chạy, cách giải quyết lỗi "nội dung có thể cuộn không rõ ràng"?
2: Tôi nên gọi PHImageManager.requestImageForAsset ở phương thức vòng đời nào của Chế độ xem? vì tôi nghĩ tôi nên đặt nội dung UIScrollViewSize theo lập trình, nhưng khi nào?
cập nhật với 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()
}
}
Làm thế nào về lỗi kịch bản? chỉ cần để nó ở đó? – paynestrike
Bạn đang sử dụng tính năng tự động trả lời? – gurmandeep
có Tôi đang sử dụng autolayout – paynestrike