ios - 收藏视图单元格的缩略图
问题描述
我正在尝试创建一个底部水平滚动缩略图视图,类似于 iOS 照片应用程序中的内容。我创建了一个ThumbnailView
我定义的文件thumbnailCollectionView
。(的collectionView
实例ThumbnailView
)作为子视图添加到我的 MainPageViewController。在DetailViewModel
中,我有一个 PHAsset 数组。我需要帮助将 a 传递UIImage
给协议方法内我的集合视图的每个单元格cellForItemAt indexPath
。我是iOS开发的新手,只是坚持这一点。
代码:
我的缩略图视图:
import UIKit
import Photos
class ThumbnailView: UIView, UICollectionViewDelegate, UICollectionViewDataSource {
var assets: [PHAsset] = []
private let imageDownloader = ImageDownloader(targetSize: CGSize(width: 100, height: 100 ))
//var selectedImage: UIImage?
lazy var thumbnailCollectionView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
let view = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
view.translatesAutoresizingMaskIntoConstraints = false
view.delegate = self
view.dataSource = self
view.register(ThumbnailCollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
view.backgroundColor = UIColor.red
return view
}()
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = UIColor.yellow
addSubview(thumbnailCollectionView)
thumbnailCollectionView.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
thumbnailCollectionView.rightAnchor.constraint(equalTo: rightAnchor).isActive = true
thumbnailCollectionView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
thumbnailCollectionView.heightAnchor.constraint(equalToConstant: 100).isActive = true
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func numberOfSections(in collectionView: UICollectionView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return assets.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath as IndexPath) as! ThumbnailCollectionViewCell
cell.backgroundColor = UIColor.orange
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
}
func configureCell(indexPath: IndexPath, image: UIImage) {
guard let cell = thumbnailCollectionView.cellForItem(at: indexPath) as? ThumbnailCollectionViewCell else {
return
}
cell.configure(image: image)
}
func getAssetThumbnail(asset: PHAsset) -> UIImage {
let manager = PHImageManager.default()
let option = PHImageRequestOptions()
var thumbnail = UIImage()
option.isSynchronous = true
manager.requestImage(for: asset, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFit, options: option, resultHandler: {(result, info)->Void in
thumbnail = result!
})
return thumbnail
}
}
我的 MainPageViewController
class MainPageViewController: UIPageViewController {
var mainImageIndex: Int?
var pageViewModels: [DetailPageViewModel]!
var viewModel: DetailViewModel!
var collectionAssets: [PHAsset] = []
// Collection View
lazy var collectionView: ThumbnailView = {
let view = ThumbnailView()
view.assets = self.collectionAssets
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
dataSource = self
delegate = self
view.backgroundColor = UIColor.green
setViewControllers([pageViewControllersArray[mainImageIndex ?? 0]], direction: .forward, animated: true, completion: nil)
self.view.addSubview(collectionView)
setupCollectioViewAutoLayout()
}
//MARK: - Create VC
lazy var pageViewControllersArray: [PageViewController] = {
return pageViewModels.map {
return PageViewController(viewModel: $0)
}
}()
func setupCollectioViewAutoLayout(){
collectionView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
collectionView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
collectionView.heightAnchor.constraint(equalToConstant: 100).isActive = true
}
func viewWillAppear() {
super.viewWillAppear(true)
}
}
extension MainPageViewController: UIPageViewControllerDelegate, UIPageViewControllerDataSource{
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard let viewController = viewController as? PageViewController else {return nil}
if let index = pageViewControllersArray.index(of: viewController){
if index > 0{
return pageViewControllersArray[index - 1]
}
}
return nil
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
guard let viewController = viewController as? PageViewController else {return nil}
if let index = pageViewControllersArray.index(of: viewController){
if index < pageViewControllersArray.count - 1{
return pageViewControllersArray[index + 1]
}
}
return nil
}
func presentationIndex(for pageViewController: UIPageViewController) -> Int{ // The selected item reflected in the page indicator.
return 0
}
}
我的 DetailViewModel
final class DetailViewModel {
private let assets: [PHAsset]
let mainImageIndex: Int
private var zoomedImageDownloader: ImageDownloader?
init(assets: [PHAsset], mainImageIndex: Int) {
self.assets = assets
self.mainImageIndex = mainImageIndex
}
lazy var pageViewModels: [DetailPageViewModel] = {
return assets.map { DetailPageViewModel(asset: $0) }
}()
lazy var thumbnailAssets: [PHAsset] = {
return assets
}()
}
解决方案
推荐阅读
- css - 相邻组件css文件在反应中相互冲突
- asp.net-mvc - 类对象 - 层次结构和继承(不工作)
- python - Tkinter 按钮图像为空白
- ios - 以编程方式创建自定义 UIView 子类的对象
- scala - 如何在列表中获取每个项目及其右侧的所有项目?[斯卡拉]
- javascript - React - 为具有行标题和列标题的表填充数据
- javascript - 为什么当我尝试从远程 html 页面获取元素时得到“ECONNRESET”
- macos - NSAlert:将第二个按钮设为默认按钮和取消按钮
- java - Exoplayer 播放器视频 mp4 e 流 m3u8
- math - 关于从初始点和最终点以及两点的斜率找到方程的任何建议?