// // AssetComparisonViewController.swift // PhotoRank // // Created by Shadowfacts on 8/3/19. // Copyright © 2019 Shadowfacts. All rights reserved. // import UIKit import Photos class AssetComparisonViewController: UIViewController { let allAssets: [PHAsset] var assetScores = [String: Int]() let assetPairs: [[PHAsset]] var currentPairIndex: Int = 0 { didSet { currentAssetPair = assetPairs[currentPairIndex] currentlySelected = 0 } } var currentlySelected: Int = 0 { didSet { largeImage.image = currentImagePair[currentlySelected] } } var currentAssetPair: [PHAsset]! { didSet { loadImages() } } var currentImagePair: [UIImage?] = [nil, nil] { didSet { largeImage.image = currentImagePair[currentlySelected] } } let largeImage = LargeImageViewController() @IBOutlet var imageContainerView: UIView! init(assets: [PHAsset]) { guard assets.count >= 2 else { fatalError("AssetComparisonViewController requires at least 2 assets") } self.allAssets = assets self.assetPairs = assets.allPairs() self.currentAssetPair = assetPairs.first! super.init(nibName: "AssetComparisonViewController", bundle: .main) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() largeImage.view.translatesAutoresizingMaskIntoConstraints = false imageContainerView.addSubview(largeImage.view) NSLayoutConstraint.activate([ largeImage.view.leadingAnchor.constraint(equalTo: imageContainerView.leadingAnchor), largeImage.view.topAnchor.constraint(equalTo: imageContainerView.topAnchor), imageContainerView.trailingAnchor.constraint(equalTo: largeImage.view.trailingAnchor), imageContainerView.bottomAnchor.constraint(equalTo: largeImage.view.bottomAnchor), ]) addChild(largeImage) toolbarItems = [ UIBarButtonItem(title: "Skip", style: .plain, target: self, action: #selector(moveToNextPair)), UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil), UIBarButtonItem(title: "Switch", style: .plain, target: self, action: #selector(switchButtonPressed)), UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil), UIBarButtonItem(title: "Pick", style: .plain, target: self, action: #selector(pickButtonPressed)) ] loadImages() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) navigationController!.isToolbarHidden = false } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) navigationController!.isToolbarHidden = true } func loadImages() { self.currentlySelected = 0 self.currentImagePair = [nil, nil] PhotosHelper.requestFullSizeImage(for: currentAssetPair[0]) { (image) in DispatchQueue.main.async { self.currentImagePair = [image, self.currentImagePair[1]] } } PhotosHelper.requestFullSizeImage(for: currentAssetPair[1]) { (image) in DispatchQueue.main.async { self.currentImagePair = [self.currentImagePair[0], image] } } } @objc func switchButtonPressed() { currentlySelected = currentlySelected == 0 ? 1 : 0 } @objc func moveToNextPair() { if currentPairIndex == assetPairs.count - 1 { print("finished: \(assetScores)") // sorts assets by score in descending order let sorted = allAssets .map { ($0, assetScores[$0.localIdentifier] ?? 0) } .sorted { (first, second) -> Bool in return first.1 > second.1 } let rankings = RankingsTableViewController(rankings: sorted) show(rankings, sender: nil) } else { currentPairIndex += 1 } } @objc func pickButtonPressed() { let identifier = currentAssetPair[currentlySelected].localIdentifier let current = assetScores[identifier] ?? 0 assetScores[identifier] = current + 1 moveToNextPair() } }