Merge branch 'mkirk/album-picker-designs'

pull/1/head
Michael Kirk 7 years ago
commit 6cbfc66ebb

@ -159,7 +159,7 @@ class ImagePickerGridController: UICollectionViewController, PhotoLibraryDelegat
collectionView.reloadData() collectionView.reloadData()
collectionView.layoutIfNeeded() collectionView.layoutIfNeeded()
let count = photoCollectionContents.count let count = photoCollectionContents.assetCount
for index in 0..<count { for index in 0..<count {
let asset = photoCollectionContents.asset(at: index) let asset = photoCollectionContents.asset(at: index)
let assetId = asset.localIdentifier let assetId = asset.localIdentifier
@ -401,7 +401,7 @@ class ImagePickerGridController: UICollectionViewController, PhotoLibraryDelegat
} }
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return photoCollectionContents.count return photoCollectionContents.assetCount
} }
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

@ -38,6 +38,7 @@ class PhotoCollectionPickerController: OWSTableViewController, PhotoLibraryDeleg
super.viewDidLoad() super.viewDidLoad()
view.backgroundColor = .ows_gray95 view.backgroundColor = .ows_gray95
tableView.separatorColor = .clear
if #available(iOS 11, *) { if #available(iOS 11, *) {
let titleLabel = UILabel() let titleLabel = UILabel()
@ -81,67 +82,82 @@ class PhotoCollectionPickerController: OWSTableViewController, PhotoLibraryDeleg
} }
} }
// MARK: -
private func updateContents() { private func updateContents() {
photoCollections = library.allPhotoCollections() photoCollections = library.allPhotoCollections()
let section = OWSTableSection() let sectionItems = photoCollections.map { collection in
for collection in photoCollections { return OWSTableItem(customCellBlock: { self.buildTableCell(collection: collection) },
section.add(OWSTableItem.init(customCellBlock: { () -> UITableViewCell in customRowHeight: UITableViewAutomaticDimension,
actionBlock: { [weak self] in
guard let strongSelf = self else { return }
strongSelf.didSelectCollection(collection: collection)
})
}
let section = OWSTableSection(title: nil, items: sectionItems)
let contents = OWSTableContents()
contents.addSection(section)
self.contents = contents
}
private let numberFormatter: NumberFormatter = NumberFormatter()
private func buildTableCell(collection: PhotoCollection) -> UITableViewCell {
let cell = OWSTableItem.newCell() let cell = OWSTableItem.newCell()
cell.backgroundColor = .ows_gray95 cell.contentView.backgroundColor = Theme.darkThemeBackgroundColor
cell.contentView.backgroundColor = .ows_gray95
cell.selectedBackgroundView?.backgroundColor = UIColor(white: 0.2, alpha: 1) cell.selectedBackgroundView?.backgroundColor = UIColor(white: 0.2, alpha: 1)
let contents = collection.contents()
let titleLabel = UILabel()
titleLabel.text = collection.localizedTitle()
titleLabel.font = UIFont.ows_dynamicTypeBody
titleLabel.textColor = Theme.darkThemePrimaryColor
let countLabel = UILabel()
countLabel.text = numberFormatter.string(for: contents.assetCount)
countLabel.font = UIFont.ows_dynamicTypeCaption1
countLabel.textColor = Theme.darkThemePrimaryColor
let textStack = UIStackView(arrangedSubviews: [titleLabel, countLabel])
textStack.axis = .vertical
textStack.alignment = .leading
textStack.spacing = 2
let imageView = UIImageView() let imageView = UIImageView()
let kImageSize = 50 let kImageSize = 80
imageView.autoSetDimensions(to: CGSize(width: kImageSize, height: kImageSize)) imageView.autoSetDimensions(to: CGSize(width: kImageSize, height: kImageSize))
let contents = collection.contents() let hStackView = UIStackView(arrangedSubviews: [imageView, textStack])
if contents.count > 0 { hStackView.axis = .horizontal
hStackView.alignment = .center
hStackView.spacing = 11
let photoMediaSize = PhotoMediaSize(thumbnailSize: CGSize(width: kImageSize, height: kImageSize)) let photoMediaSize = PhotoMediaSize(thumbnailSize: CGSize(width: kImageSize, height: kImageSize))
let assetItem = contents.assetItem(at: 0, photoMediaSize: photoMediaSize) if let assetItem = contents.lastAssetItem(photoMediaSize: photoMediaSize) {
imageView.image = assetItem.asyncThumbnail { [weak imageView] image in imageView.image = assetItem.asyncThumbnail { [weak imageView] image in
guard let strongImageView = imageView else { AssertIsOnMainThread()
guard let imageView = imageView else {
return return
} }
guard let image = image else { guard let image = image else {
owsFailDebug("image was unexpectedly nil")
return return
} }
strongImageView.image = image
imageView.image = image
} }
} }
let titleLabel = UILabel() cell.contentView.addSubview(hStackView)
titleLabel.text = collection.localizedTitle() hStackView.ows_autoPinToSuperviewMargins()
titleLabel.font = UIFont.ows_dynamicTypeBody
titleLabel.textColor = .ows_gray05
let stackView = UIStackView(arrangedSubviews: [imageView, titleLabel])
stackView.axis = .horizontal
stackView.alignment = .center
stackView.spacing = 10
cell.contentView.addSubview(stackView)
stackView.ows_autoPinToSuperviewMargins()
return cell return cell
},
customRowHeight: UITableViewAutomaticDimension,
actionBlock: { [weak self] in
guard let strongSelf = self else { return }
strongSelf.didSelectCollection(collection: collection)
}))
}
let contents = OWSTableContents()
contents.addSection(section)
self.contents = contents
}
@objc
public override func applyTheme() {
view.backgroundColor = .ows_gray95
tableView.backgroundColor = .ows_gray95
} }
// MARK: Actions // MARK: Actions

@ -25,12 +25,12 @@ class PhotoMediaSize {
class PhotoPickerAssetItem: PhotoGridItem { class PhotoPickerAssetItem: PhotoGridItem {
let asset: PHAsset let asset: PHAsset
let album: PhotoCollectionContents let photoCollectionContents: PhotoCollectionContents
let photoMediaSize: PhotoMediaSize let photoMediaSize: PhotoMediaSize
init(asset: PHAsset, album: PhotoCollectionContents, photoMediaSize: PhotoMediaSize) { init(asset: PHAsset, photoCollectionContents: PhotoCollectionContents, photoMediaSize: PhotoMediaSize) {
self.asset = asset self.asset = asset
self.album = album self.photoCollectionContents = photoCollectionContents
self.photoMediaSize = photoMediaSize self.photoMediaSize = photoMediaSize
} }
@ -47,7 +47,7 @@ class PhotoPickerAssetItem: PhotoGridItem {
} }
func asyncThumbnail(completion: @escaping (UIImage?) -> Void) -> UIImage? { func asyncThumbnail(completion: @escaping (UIImage?) -> Void) -> UIImage? {
album.requestThumbnail(for: self.asset, thumbnailSize: photoMediaSize.thumbnailSize) { image, _ in photoCollectionContents.requestThumbnail(for: self.asset, thumbnailSize: photoMediaSize.thumbnailSize) { image, _ in
completion(image) completion(image)
} }
return nil return nil
@ -70,19 +70,51 @@ class PhotoCollectionContents {
self.localizedTitle = localizedTitle self.localizedTitle = localizedTitle
} }
var count: Int { private let imageManager = PHCachingImageManager()
// MARK: - Asset Accessors
var assetCount: Int {
return fetchResult.count return fetchResult.count
} }
private let imageManager = PHCachingImageManager() var lastAsset: PHAsset? {
guard assetCount > 0 else {
return nil
}
return asset(at: assetCount - 1)
}
var firstAsset: PHAsset? {
guard assetCount > 0 else {
return nil
}
return asset(at: 0)
}
func asset(at index: Int) -> PHAsset { func asset(at index: Int) -> PHAsset {
return fetchResult.object(at: index) return fetchResult.object(at: index)
} }
// MARK: - AssetItem Accessors
func assetItem(at index: Int, photoMediaSize: PhotoMediaSize) -> PhotoPickerAssetItem { func assetItem(at index: Int, photoMediaSize: PhotoMediaSize) -> PhotoPickerAssetItem {
let mediaAsset = asset(at: index) let mediaAsset = asset(at: index)
return PhotoPickerAssetItem(asset: mediaAsset, album: self, photoMediaSize: photoMediaSize) return PhotoPickerAssetItem(asset: mediaAsset, photoCollectionContents: self, photoMediaSize: photoMediaSize)
}
func firstAssetItem(photoMediaSize: PhotoMediaSize) -> PhotoPickerAssetItem? {
guard let mediaAsset = firstAsset else {
return nil
}
return PhotoPickerAssetItem(asset: mediaAsset, photoCollectionContents: self, photoMediaSize: photoMediaSize)
}
func lastAssetItem(photoMediaSize: PhotoMediaSize) -> PhotoPickerAssetItem? {
guard let mediaAsset = lastAsset else {
return nil
}
return PhotoPickerAssetItem(asset: mediaAsset, photoCollectionContents: self, photoMediaSize: photoMediaSize)
} }
// MARK: ImageManager // MARK: ImageManager
@ -242,7 +274,7 @@ class PhotoLibrary: NSObject, PHPhotoLibraryChangeObserver {
} }
let photoCollection = PhotoCollection(collection: assetCollection) let photoCollection = PhotoCollection(collection: assetCollection)
// Hide empty collections. // Hide empty collections.
guard photoCollection.contents().count > 0 else { guard photoCollection.contents().assetCount > 0 else {
return return
} }
collections.append(photoCollection) collections.append(photoCollection)

Loading…
Cancel
Save