From 6bb64ea9e57a109cbe587354a94345575d22ad14 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 26 Aug 2016 14:32:01 -0400 Subject: [PATCH 01/55] Add Carthage-compatible badge --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3cb8a263..aadf8429 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ # NYTPhotoViewer -[![Platform](http://cocoapod-badges.herokuapp.com/p/NYTPhotoViewer/badge.png)](http://cocoadocs.org/docsets/NYTPhotoViewer) -[![Version](http://cocoapod-badges.herokuapp.com/v/NYTPhotoViewer/badge.png)](http://cocoadocs.org/docsets/NYTPhotoViewer) +[![Platform](http://cocoapod-badges.herokuapp.com/p/NYTPhotoViewer/badge.png)](http://cocoadocs.org/docsets/NYTPhotoViewer) +[![Version](http://cocoapod-badges.herokuapp.com/v/NYTPhotoViewer/badge.png)](http://cocoadocs.org/docsets/NYTPhotoViewer) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) NYTPhotoViewer is a slideshow and image viewer that includes double-tap to zoom, captions, support for multiple images, interactive flick to dismiss, animated zooming presentation, and more. From bf796d34ea7166b845778aafdf0f2175f4c79e75 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 9 Dec 2016 14:15:05 -0500 Subject: [PATCH 02/55] Migrate Swift Example to Swift 3 --- Example-Swift/AppDelegate.swift | 2 +- Example-Swift/ExamplePhoto.swift | 8 ++--- Example-Swift/PhotosProvider.swift | 4 +-- Example-Swift/ViewController.swift | 44 ++++++++++++------------ NYTPhotoViewer.xcodeproj/project.pbxproj | 3 ++ 5 files changed, 32 insertions(+), 29 deletions(-) diff --git a/Example-Swift/AppDelegate.swift b/Example-Swift/AppDelegate.swift index 8be6e6aa..49e51006 100755 --- a/Example-Swift/AppDelegate.swift +++ b/Example-Swift/AppDelegate.swift @@ -13,7 +13,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { return true } } diff --git a/Example-Swift/ExamplePhoto.swift b/Example-Swift/ExamplePhoto.swift index 6df2b0cb..929c4bdd 100755 --- a/Example-Swift/ExamplePhoto.swift +++ b/Example-Swift/ExamplePhoto.swift @@ -12,13 +12,13 @@ import NYTPhotoViewer class ExamplePhoto: NSObject, NYTPhoto { var image: UIImage? - var imageData: NSData? + var imageData: Data? var placeholderImage: UIImage? let attributedCaptionTitle: NSAttributedString? - let attributedCaptionSummary: NSAttributedString? = NSAttributedString(string: "summary string", attributes: [NSForegroundColorAttributeName: UIColor.grayColor()]) - let attributedCaptionCredit: NSAttributedString? = NSAttributedString(string: "credit", attributes: [NSForegroundColorAttributeName: UIColor.darkGrayColor()]) + let attributedCaptionSummary: NSAttributedString? = NSAttributedString(string: "summary string", attributes: [NSForegroundColorAttributeName: UIColor.gray]) + let attributedCaptionCredit: NSAttributedString? = NSAttributedString(string: "credit", attributes: [NSForegroundColorAttributeName: UIColor.darkGray]) - init(image: UIImage? = nil, imageData: NSData? = nil, attributedCaptionTitle: NSAttributedString) { + init(image: UIImage? = nil, imageData: Data? = nil, attributedCaptionTitle: NSAttributedString) { self.image = image self.imageData = imageData self.attributedCaptionTitle = attributedCaptionTitle diff --git a/Example-Swift/PhotosProvider.swift b/Example-Swift/PhotosProvider.swift index 23488004..8922129a 100755 --- a/Example-Swift/PhotosProvider.swift +++ b/Example-Swift/PhotosProvider.swift @@ -24,12 +24,12 @@ class PhotosProvider: NSObject { var image = UIImage(named: PrimaryImageName) let NumberOfPhotos = 5 - func shouldSetImageOnIndex(photoIndex: Int) -> Bool { + func shouldSetImageOnIndex(_ photoIndex: Int) -> Bool { return photoIndex != CustomEverythingPhotoIndex && photoIndex != DefaultLoadingSpinnerPhotoIndex } for photoIndex in 0 ..< NumberOfPhotos { - let title = NSAttributedString(string: "\(photoIndex + 1)", attributes: [NSForegroundColorAttributeName: UIColor.whiteColor()]) + let title = NSAttributedString(string: "\(photoIndex + 1)", attributes: [NSForegroundColorAttributeName: UIColor.white]) let photo = shouldSetImageOnIndex(photoIndex) ? ExamplePhoto(image: image, attributedCaptionTitle: title) : ExamplePhoto(attributedCaptionTitle: title) diff --git a/Example-Swift/ViewController.swift b/Example-Swift/ViewController.swift index 5e341be2..223bd657 100755 --- a/Example-Swift/ViewController.swift +++ b/Example-Swift/ViewController.swift @@ -13,25 +13,25 @@ import NYTPhotoViewer class ViewController: UIViewController, NYTPhotosViewControllerDelegate { @IBOutlet weak var imageButton : UIButton? - private let photos = PhotosProvider().photos + fileprivate let photos = PhotosProvider().photos - @IBAction func buttonTapped(sender: UIButton) { + @IBAction func buttonTapped(_ sender: UIButton) { let photosViewController = NYTPhotosViewController(photos: self.photos) photosViewController.delegate = self - presentViewController(photosViewController, animated: true, completion: nil) + present(photosViewController, animated: true, completion: nil) updateImagesOnPhotosViewController(photosViewController, afterDelayWithPhotos: photos) } - func updateImagesOnPhotosViewController(photosViewController: NYTPhotosViewController, afterDelayWithPhotos: [ExamplePhoto]) { + func updateImagesOnPhotosViewController(_ photosViewController: NYTPhotosViewController, afterDelayWithPhotos: [ExamplePhoto]) { - let delayTime = dispatch_time(DISPATCH_TIME_NOW, 5 * Int64(NSEC_PER_SEC)) + let delayTime = DispatchTime.now() + Double(5 * Int64(NSEC_PER_SEC)) / Double(NSEC_PER_SEC) - dispatch_after(delayTime, dispatch_get_main_queue()) { + DispatchQueue.main.asyncAfter(deadline: delayTime) { for photo in self.photos { if photo.image == nil { photo.image = UIImage(named: PrimaryImageName) - photosViewController.updateImageForPhoto(photo) + photosViewController.updateImage(for: photo) } } } @@ -40,27 +40,27 @@ class ViewController: UIViewController, NYTPhotosViewControllerDelegate { override func viewDidLoad() { super.viewDidLoad() let buttonImage = UIImage(named: PrimaryImageName) - imageButton?.setBackgroundImage(buttonImage, forState: .Normal) + imageButton?.setBackgroundImage(buttonImage, for: UIControlState()) } // MARK: - NYTPhotosViewControllerDelegate - func photosViewController(photosViewController: NYTPhotosViewController, handleActionButtonTappedForPhoto photo: NYTPhoto) -> Bool { + func photosViewController(_ photosViewController: NYTPhotosViewController, handleActionButtonTappedFor photo: NYTPhoto) -> Bool { - if UIDevice.currentDevice().userInterfaceIdiom == .Pad { + if UIDevice.current.userInterfaceIdiom == .pad { guard let photoImage = photo.image else { return false } let shareActivityViewController = UIActivityViewController(activityItems: [photoImage], applicationActivities: nil) - shareActivityViewController.completionWithItemsHandler = {(activityType: String?, completed: Bool, items: [AnyObject]?, error: NSError?) in + shareActivityViewController.completionWithItemsHandler = {(activityType: UIActivityType?, completed: Bool, items: [Any]?, error: Error?) in if completed { - photosViewController.delegate?.photosViewController!(photosViewController, actionCompletedWithActivityType: activityType!) + photosViewController.delegate?.photosViewController!(photosViewController, actionCompletedWithActivityType: activityType?.rawValue) } } shareActivityViewController.popoverPresentationController?.barButtonItem = photosViewController.rightBarButtonItem - photosViewController.presentViewController(shareActivityViewController, animated: true, completion: nil) + photosViewController.present(shareActivityViewController, animated: true, completion: nil) return true } @@ -68,43 +68,43 @@ class ViewController: UIViewController, NYTPhotosViewControllerDelegate { return false } - func photosViewController(photosViewController: NYTPhotosViewController, referenceViewForPhoto photo: NYTPhoto) -> UIView? { + func photosViewController(_ photosViewController: NYTPhotosViewController, referenceViewFor photo: NYTPhoto) -> UIView? { if photo as? ExamplePhoto == photos[NoReferenceViewPhotoIndex] { return nil } return imageButton } - func photosViewController(photosViewController: NYTPhotosViewController, loadingViewForPhoto photo: NYTPhoto) -> UIView? { + func photosViewController(_ photosViewController: NYTPhotosViewController, loadingViewFor photo: NYTPhoto) -> UIView? { if photo as! ExamplePhoto == photos[CustomEverythingPhotoIndex] { let label = UILabel() label.text = "Custom Loading..." - label.textColor = UIColor.greenColor() + label.textColor = UIColor.green return label } return nil } - func photosViewController(photosViewController: NYTPhotosViewController, captionViewForPhoto photo: NYTPhoto) -> UIView? { + func photosViewController(_ photosViewController: NYTPhotosViewController, captionViewFor photo: NYTPhoto) -> UIView? { if photo as! ExamplePhoto == photos[CustomEverythingPhotoIndex] { let label = UILabel() label.text = "Custom Caption View" - label.textColor = UIColor.whiteColor() - label.backgroundColor = UIColor.redColor() + label.textColor = UIColor.white + label.backgroundColor = UIColor.red return label } return nil } - func photosViewController(photosViewController: NYTPhotosViewController, didNavigateToPhoto photo: NYTPhoto, atIndex photoIndex: UInt) { + func photosViewController(_ photosViewController: NYTPhotosViewController, didNavigateTo photo: NYTPhoto, at photoIndex: UInt) { print("Did Navigate To Photo: \(photo) identifier: \(photoIndex)") } - func photosViewController(photosViewController: NYTPhotosViewController, actionCompletedWithActivityType activityType: String?) { + func photosViewController(_ photosViewController: NYTPhotosViewController, actionCompletedWithActivityType activityType: String?) { print("Action Completed With Activity Type: \(activityType)") } - func photosViewControllerDidDismiss(photosViewController: NYTPhotosViewController) { + func photosViewControllerDidDismiss(_ photosViewController: NYTPhotosViewController) { print("Did dismiss Photo Viewer: \(photosViewController)") } } diff --git a/NYTPhotoViewer.xcodeproj/project.pbxproj b/NYTPhotoViewer.xcodeproj/project.pbxproj index 95143a45..b0b9c294 100644 --- a/NYTPhotoViewer.xcodeproj/project.pbxproj +++ b/NYTPhotoViewer.xcodeproj/project.pbxproj @@ -667,6 +667,7 @@ }; 11FBDADB1C877BD600018169 = { CreatedOnToolsVersion = 7.2.1; + LastSwiftMigration = 0810; }; }; }; @@ -1168,6 +1169,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.NYTimes.Example-Swift"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -1183,6 +1185,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.NYTimes.Example-Swift"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Release; }; From 1acd4969a78a594c061975b0c158dd6092733b1c Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 9 Dec 2016 14:53:31 -0500 Subject: [PATCH 03/55] clarify when `NYTPhotoCaptionView` is used --- NYTPhotoViewer/NYTPhotoCaptionView.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NYTPhotoViewer/NYTPhotoCaptionView.h b/NYTPhotoViewer/NYTPhotoCaptionView.h index 1b712ae5..7604b733 100644 --- a/NYTPhotoViewer/NYTPhotoCaptionView.h +++ b/NYTPhotoViewer/NYTPhotoCaptionView.h @@ -13,6 +13,8 @@ NS_ASSUME_NONNULL_BEGIN /** * A view used to display the caption for a photo. + * + * This is used by default when no custom caption view is provided. */ @interface NYTPhotoCaptionView : UIView From 66784dbb1f02fe411d5346ae4e4f9ca6c03bd0bd Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 9 Dec 2016 15:00:45 -0500 Subject: [PATCH 04/55] rename concrete data source to `NYTPhotoViewerArrayDataSource` --- NYTPhotoViewer.xcodeproj/project.pbxproj | 24 +++++++++---------- NYTPhotoViewer/NYTPhotoViewer.h | 2 +- ...urce.h => NYTPhotoViewerArrayDataSource.h} | 6 ++--- ...urce.m => NYTPhotoViewerArrayDataSource.m} | 12 +++++----- NYTPhotoViewer/NYTPhotoViewerCore.h | 4 ++-- NYTPhotoViewer/NYTPhotosViewController.m | 4 ++-- 6 files changed, 26 insertions(+), 26 deletions(-) rename NYTPhotoViewer/{NYTPhotosDataSource.h => NYTPhotoViewerArrayDataSource.h} (68%) rename NYTPhotoViewer/{NYTPhotosDataSource.m => NYTPhotoViewerArrayDataSource.m} (82%) diff --git a/NYTPhotoViewer.xcodeproj/project.pbxproj b/NYTPhotoViewer.xcodeproj/project.pbxproj index 95143a45..567cb655 100644 --- a/NYTPhotoViewer.xcodeproj/project.pbxproj +++ b/NYTPhotoViewer.xcodeproj/project.pbxproj @@ -19,8 +19,8 @@ 1110844D1C87682300699670 /* NYTPhotoCaptionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 111084341C87682300699670 /* NYTPhotoCaptionView.m */; }; 1110844E1C87682300699670 /* NYTPhotoDismissalInteractionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084351C87682300699670 /* NYTPhotoDismissalInteractionController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1110844F1C87682300699670 /* NYTPhotoDismissalInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 111084361C87682300699670 /* NYTPhotoDismissalInteractionController.m */; }; - 111084501C87682300699670 /* NYTPhotosDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084371C87682300699670 /* NYTPhotosDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 111084511C87682300699670 /* NYTPhotosDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 111084381C87682300699670 /* NYTPhotosDataSource.m */; }; + 111084501C87682300699670 /* NYTPhotoViewerArrayDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084371C87682300699670 /* NYTPhotoViewerArrayDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 111084511C87682300699670 /* NYTPhotoViewerArrayDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 111084381C87682300699670 /* NYTPhotoViewerArrayDataSource.m */; }; 111084521C87682300699670 /* NYTPhotosOverlayView.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084391C87682300699670 /* NYTPhotosOverlayView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 111084531C87682300699670 /* NYTPhotosOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1110843A1C87682300699670 /* NYTPhotosOverlayView.m */; }; 111084541C87682300699670 /* NYTPhotosViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1110843B1C87682300699670 /* NYTPhotosViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -63,8 +63,8 @@ 11FBDA8D1C87753200018169 /* NYTPhotoCaptionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 111084341C87682300699670 /* NYTPhotoCaptionView.m */; }; 11FBDA8E1C87753200018169 /* NYTPhotoDismissalInteractionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084351C87682300699670 /* NYTPhotoDismissalInteractionController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11FBDA8F1C87753200018169 /* NYTPhotoDismissalInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 111084361C87682300699670 /* NYTPhotoDismissalInteractionController.m */; }; - 11FBDA901C87753200018169 /* NYTPhotosDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084371C87682300699670 /* NYTPhotosDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 11FBDA911C87753200018169 /* NYTPhotosDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 111084381C87682300699670 /* NYTPhotosDataSource.m */; }; + 11FBDA901C87753200018169 /* NYTPhotoViewerArrayDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084371C87682300699670 /* NYTPhotoViewerArrayDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 11FBDA911C87753200018169 /* NYTPhotoViewerArrayDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 111084381C87682300699670 /* NYTPhotoViewerArrayDataSource.m */; }; 11FBDA921C87753200018169 /* NYTPhotosOverlayView.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084391C87682300699670 /* NYTPhotosOverlayView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11FBDA931C87753200018169 /* NYTPhotosOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1110843A1C87682300699670 /* NYTPhotosOverlayView.m */; }; 11FBDA941C87753200018169 /* NYTPhotosViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1110843B1C87682300699670 /* NYTPhotosViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -241,8 +241,8 @@ 111084341C87682300699670 /* NYTPhotoCaptionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoCaptionView.m; sourceTree = ""; }; 111084351C87682300699670 /* NYTPhotoDismissalInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoDismissalInteractionController.h; sourceTree = ""; }; 111084361C87682300699670 /* NYTPhotoDismissalInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoDismissalInteractionController.m; sourceTree = ""; }; - 111084371C87682300699670 /* NYTPhotosDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotosDataSource.h; sourceTree = ""; }; - 111084381C87682300699670 /* NYTPhotosDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotosDataSource.m; sourceTree = ""; }; + 111084371C87682300699670 /* NYTPhotoViewerArrayDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoViewerArrayDataSource.h; sourceTree = ""; }; + 111084381C87682300699670 /* NYTPhotoViewerArrayDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoViewerArrayDataSource.m; sourceTree = ""; }; 111084391C87682300699670 /* NYTPhotosOverlayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotosOverlayView.h; sourceTree = ""; }; 1110843A1C87682300699670 /* NYTPhotosOverlayView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotosOverlayView.m; sourceTree = ""; }; 1110843B1C87682300699670 /* NYTPhotosViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotosViewController.h; sourceTree = ""; }; @@ -369,8 +369,8 @@ 111084341C87682300699670 /* NYTPhotoCaptionView.m */, 111084351C87682300699670 /* NYTPhotoDismissalInteractionController.h */, 111084361C87682300699670 /* NYTPhotoDismissalInteractionController.m */, - 111084371C87682300699670 /* NYTPhotosDataSource.h */, - 111084381C87682300699670 /* NYTPhotosDataSource.m */, + 111084371C87682300699670 /* NYTPhotoViewerArrayDataSource.h */, + 111084381C87682300699670 /* NYTPhotoViewerArrayDataSource.m */, 111084391C87682300699670 /* NYTPhotosOverlayView.h */, 1110843A1C87682300699670 /* NYTPhotosOverlayView.m */, 1110843B1C87682300699670 /* NYTPhotosViewController.h */, @@ -516,7 +516,7 @@ 111084581C87682300699670 /* NYTPhotoTransitionController.h in Headers */, 1110845F1C87682300699670 /* NYTPhotoCaptionViewLayoutWidthHinting.h in Headers */, 1110845E1C87682300699670 /* NYTPhoto.h in Headers */, - 111084501C87682300699670 /* NYTPhotosDataSource.h in Headers */, + 111084501C87682300699670 /* NYTPhotoViewerArrayDataSource.h in Headers */, 1110840A1C875B5000699670 /* NYTPhotoViewer.h in Headers */, 111084651C87684D00699670 /* NYTPhotoCaptionView.h in Headers */, ); @@ -532,7 +532,7 @@ 11FBDA921C87753200018169 /* NYTPhotosOverlayView.h in Headers */, 11FBDA8E1C87753200018169 /* NYTPhotoDismissalInteractionController.h in Headers */, 11FBDAA11C87753200018169 /* NYTPhotosViewControllerDataSource.h in Headers */, - 11FBDA901C87753200018169 /* NYTPhotosDataSource.h in Headers */, + 11FBDA901C87753200018169 /* NYTPhotoViewerArrayDataSource.h in Headers */, 11FBDA9F1C87753200018169 /* NYTPhotoCaptionViewLayoutWidthHinting.h in Headers */, 11FBDA941C87753200018169 /* NYTPhotosViewController.h in Headers */, 11FBDAA61C87768B00018169 /* NYTPhotoViewerCore.h in Headers */, @@ -813,7 +813,7 @@ 111084551C87682300699670 /* NYTPhotosViewController.m in Sources */, 1110844D1C87682300699670 /* NYTPhotoCaptionView.m in Sources */, 1110845D1C87682300699670 /* NYTScalingImageView.m in Sources */, - 111084511C87682300699670 /* NYTPhotosDataSource.m in Sources */, + 111084511C87682300699670 /* NYTPhotoViewerArrayDataSource.m in Sources */, 111084531C87682300699670 /* NYTPhotosOverlayView.m in Sources */, 111084571C87682300699670 /* NYTPhotoTransitionAnimator.m in Sources */, 1110844F1C87682300699670 /* NYTPhotoDismissalInteractionController.m in Sources */, @@ -856,7 +856,7 @@ 11FBDA951C87753200018169 /* NYTPhotosViewController.m in Sources */, 11FBDA8D1C87753200018169 /* NYTPhotoCaptionView.m in Sources */, 11FBDA9D1C87753200018169 /* NYTScalingImageView.m in Sources */, - 11FBDA911C87753200018169 /* NYTPhotosDataSource.m in Sources */, + 11FBDA911C87753200018169 /* NYTPhotoViewerArrayDataSource.m in Sources */, 11FBDA931C87753200018169 /* NYTPhotosOverlayView.m in Sources */, 11FBDA971C87753200018169 /* NYTPhotoTransitionAnimator.m in Sources */, 11FBDA8F1C87753200018169 /* NYTPhotoDismissalInteractionController.m in Sources */, diff --git a/NYTPhotoViewer/NYTPhotoViewer.h b/NYTPhotoViewer/NYTPhotoViewer.h index 7ed4c3e9..3172499c 100644 --- a/NYTPhotoViewer/NYTPhotoViewer.h +++ b/NYTPhotoViewer/NYTPhotoViewer.h @@ -17,7 +17,7 @@ FOUNDATION_EXPORT const unsigned char NYTPhotoViewerVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import #import #import -#import +#import #import #import #import diff --git a/NYTPhotoViewer/NYTPhotosDataSource.h b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h similarity index 68% rename from NYTPhotoViewer/NYTPhotosDataSource.h rename to NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h index 053f30bc..9ae79f94 100644 --- a/NYTPhotoViewer/NYTPhotosDataSource.h +++ b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h @@ -1,5 +1,5 @@ // -// NYTPhotosDataSource.h +// NYTPhotoViewerArrayDataSource.h // NYTPhotoViewer // // Created by Brian Capps on 2/11/15. @@ -13,9 +13,9 @@ NS_ASSUME_NONNULL_BEGIN /** - * A concrete implementation of the `NYTPhotosViewControllerDataSource`. + * A simple concrete implementation of `NYTPhotoViewerDataSource`, for use with an array of images. */ -@interface NYTPhotosDataSource : NSObject +@interface NYTPhotoViewerArrayDataSource : NSObject /** * The designated initializer that takes and stores an array of photos. diff --git a/NYTPhotoViewer/NYTPhotosDataSource.m b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m similarity index 82% rename from NYTPhotoViewer/NYTPhotosDataSource.m rename to NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m index 98f9453d..282ca128 100644 --- a/NYTPhotoViewer/NYTPhotosDataSource.m +++ b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m @@ -1,20 +1,20 @@ // -// NYTPhotosDataSource.m +// NYTPhotoViewerArrayDataSource.m // NYTPhotoViewer // // Created by Brian Capps on 2/11/15. // // -#import "NYTPhotosDataSource.h" +#import "NYTPhotoViewerArrayDataSource.h" -@interface NYTPhotosDataSource () +@interface NYTPhotoViewerArrayDataSource () -@property (nonatomic, copy) NSArray *photos; +@property (nonatomic, readonly) NSArray *photos; @end -@implementation NYTPhotosDataSource +@implementation NYTPhotoViewerArrayDataSource #pragma mark - NSObject @@ -28,7 +28,7 @@ - (instancetype)initWithPhotos:(NSArray *)photos { self = [super init]; if (self) { - _photos = photos; + _photos = [photos copy]; } return self; diff --git a/NYTPhotoViewer/NYTPhotoViewerCore.h b/NYTPhotoViewer/NYTPhotoViewerCore.h index 4d46ea12..ca92f70b 100644 --- a/NYTPhotoViewer/NYTPhotoViewerCore.h +++ b/NYTPhotoViewer/NYTPhotoViewerCore.h @@ -1,5 +1,5 @@ // -// NYTPhotoViewer.h +// NYTPhotoViewerCore.h // NYTPhotoViewer // // Created by David Beck on 3/2/16. @@ -17,7 +17,7 @@ FOUNDATION_EXPORT const unsigned char NYTPhotoViewerCoreVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import #import #import -#import +#import #import #import #import diff --git a/NYTPhotoViewer/NYTPhotosViewController.m b/NYTPhotoViewer/NYTPhotosViewController.m index d66060cc..a0298db4 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.m +++ b/NYTPhotoViewer/NYTPhotosViewController.m @@ -8,7 +8,7 @@ #import "NYTPhotosViewController.h" #import "NYTPhotosViewControllerDataSource.h" -#import "NYTPhotosDataSource.h" +#import "NYTPhotoViewerArrayDataSource.h" #import "NYTPhotoViewController.h" #import "NYTPhotoTransitionController.h" #import "NYTScalingImageView.h" @@ -174,7 +174,7 @@ - (instancetype)initWithPhotos:(NSArray *)photos initialPhoto:(id )ini } - (void)commonInitWithPhotos:(NSArray *)photos initialPhoto:(id )initialPhoto delegate:(id)delegate { - _dataSource = [[NYTPhotosDataSource alloc] initWithPhotos:photos]; + _dataSource = [[NYTPhotoViewerArrayDataSource alloc] initWithPhotos:photos]; _delegate = delegate; _panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(didPanWithGestureRecognizer:)]; From f5e3dc866c6bd5462b38333d07dbd9a4bfbe0c62 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 9 Dec 2016 15:00:56 -0500 Subject: [PATCH 05/55] [minor] add clarifying comment to umbrella header --- NYTPhotoViewer/NYTPhotoViewer.h | 1 + NYTPhotoViewer/NYTPhotoViewerCore.h | 1 + 2 files changed, 2 insertions(+) diff --git a/NYTPhotoViewer/NYTPhotoViewer.h b/NYTPhotoViewer/NYTPhotoViewer.h index 3172499c..2e6253e6 100644 --- a/NYTPhotoViewer/NYTPhotoViewer.h +++ b/NYTPhotoViewer/NYTPhotoViewer.h @@ -31,4 +31,5 @@ FOUNDATION_EXPORT const unsigned char NYTPhotoViewerVersionString[]; #import #import +// Support #import diff --git a/NYTPhotoViewer/NYTPhotoViewerCore.h b/NYTPhotoViewer/NYTPhotoViewerCore.h index ca92f70b..9de7e896 100644 --- a/NYTPhotoViewer/NYTPhotoViewerCore.h +++ b/NYTPhotoViewer/NYTPhotoViewerCore.h @@ -31,4 +31,5 @@ FOUNDATION_EXPORT const unsigned char NYTPhotoViewerCoreVersionString[]; #import #import +// Support #import From 4c180d92d9ccb23b68fba78608ab4c65b43e1f23 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 9 Dec 2016 16:38:20 -0500 Subject: [PATCH 06/55] Rename `NYTPhotoViewerDataSource` and clarify it vs. delegate --- NYTPhotoViewer.xcodeproj/project.pbxproj | 12 ++-- NYTPhotoViewer/NYTPhotoViewer.h | 2 +- .../NYTPhotoViewerArrayDataSource.h | 4 +- NYTPhotoViewer/NYTPhotoViewerCore.h | 2 +- NYTPhotoViewer/NYTPhotosViewController.h | 16 +++-- NYTPhotoViewer/NYTPhotosViewController.m | 4 +- .../Protocols/NYTPhotoViewerDataSource.h | 51 ++++++++++++++++ .../NYTPhotosViewControllerDataSource.h | 60 ------------------- 8 files changed, 73 insertions(+), 78 deletions(-) create mode 100644 NYTPhotoViewer/Protocols/NYTPhotoViewerDataSource.h delete mode 100644 NYTPhotoViewer/Protocols/NYTPhotosViewControllerDataSource.h diff --git a/NYTPhotoViewer.xcodeproj/project.pbxproj b/NYTPhotoViewer.xcodeproj/project.pbxproj index 567cb655..50bcff3a 100644 --- a/NYTPhotoViewer.xcodeproj/project.pbxproj +++ b/NYTPhotoViewer.xcodeproj/project.pbxproj @@ -36,7 +36,7 @@ 1110845E1C87682300699670 /* NYTPhoto.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084461C87682300699670 /* NYTPhoto.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1110845F1C87682300699670 /* NYTPhotoCaptionViewLayoutWidthHinting.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084471C87682300699670 /* NYTPhotoCaptionViewLayoutWidthHinting.h */; settings = {ATTRIBUTES = (Public, ); }; }; 111084601C87682300699670 /* NYTPhotoContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084481C87682300699670 /* NYTPhotoContainer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 111084611C87682300699670 /* NYTPhotosViewControllerDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084491C87682300699670 /* NYTPhotosViewControllerDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 111084611C87682300699670 /* NYTPhotoViewerDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084491C87682300699670 /* NYTPhotoViewerDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; 111084621C87682300699670 /* NSBundle+NYTPhotoViewer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1110844B1C87682300699670 /* NSBundle+NYTPhotoViewer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 111084631C87682300699670 /* NSBundle+NYTPhotoViewer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1110844C1C87682300699670 /* NSBundle+NYTPhotoViewer.m */; }; 111084651C87684D00699670 /* NYTPhotoCaptionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084641C87684D00699670 /* NYTPhotoCaptionView.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -80,7 +80,7 @@ 11FBDA9E1C87753200018169 /* NYTPhoto.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084461C87682300699670 /* NYTPhoto.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11FBDA9F1C87753200018169 /* NYTPhotoCaptionViewLayoutWidthHinting.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084471C87682300699670 /* NYTPhotoCaptionViewLayoutWidthHinting.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11FBDAA01C87753200018169 /* NYTPhotoContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084481C87682300699670 /* NYTPhotoContainer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 11FBDAA11C87753200018169 /* NYTPhotosViewControllerDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084491C87682300699670 /* NYTPhotosViewControllerDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 11FBDAA11C87753200018169 /* NYTPhotoViewerDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 111084491C87682300699670 /* NYTPhotoViewerDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11FBDAA21C87753200018169 /* NSBundle+NYTPhotoViewer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1110844B1C87682300699670 /* NSBundle+NYTPhotoViewer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11FBDAA31C87753200018169 /* NSBundle+NYTPhotoViewer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1110844C1C87682300699670 /* NSBundle+NYTPhotoViewer.m */; }; 11FBDAA41C87754A00018169 /* NYTPhotoViewer.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 11FBDA791C87714600018169 /* NYTPhotoViewer.bundle */; }; @@ -258,7 +258,7 @@ 111084461C87682300699670 /* NYTPhoto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhoto.h; sourceTree = ""; }; 111084471C87682300699670 /* NYTPhotoCaptionViewLayoutWidthHinting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoCaptionViewLayoutWidthHinting.h; sourceTree = ""; }; 111084481C87682300699670 /* NYTPhotoContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoContainer.h; sourceTree = ""; }; - 111084491C87682300699670 /* NYTPhotosViewControllerDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotosViewControllerDataSource.h; sourceTree = ""; }; + 111084491C87682300699670 /* NYTPhotoViewerDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoViewerDataSource.h; sourceTree = ""; }; 1110844B1C87682300699670 /* NSBundle+NYTPhotoViewer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSBundle+NYTPhotoViewer.h"; sourceTree = ""; }; 1110844C1C87682300699670 /* NSBundle+NYTPhotoViewer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSBundle+NYTPhotoViewer.m"; sourceTree = ""; }; 111084641C87684D00699670 /* NYTPhotoCaptionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoCaptionView.h; sourceTree = ""; }; @@ -411,7 +411,7 @@ 111084461C87682300699670 /* NYTPhoto.h */, 111084471C87682300699670 /* NYTPhotoCaptionViewLayoutWidthHinting.h */, 111084481C87682300699670 /* NYTPhotoContainer.h */, - 111084491C87682300699670 /* NYTPhotosViewControllerDataSource.h */, + 111084491C87682300699670 /* NYTPhotoViewerDataSource.h */, ); path = Protocols; sourceTree = ""; @@ -508,7 +508,7 @@ 111084541C87682300699670 /* NYTPhotosViewController.h in Headers */, 111084601C87682300699670 /* NYTPhotoContainer.h in Headers */, 1110844E1C87682300699670 /* NYTPhotoDismissalInteractionController.h in Headers */, - 111084611C87682300699670 /* NYTPhotosViewControllerDataSource.h in Headers */, + 111084611C87682300699670 /* NYTPhotoViewerDataSource.h in Headers */, 1110845A1C87682300699670 /* NYTPhotoViewController.h in Headers */, 1110845C1C87682300699670 /* NYTScalingImageView.h in Headers */, 111084521C87682300699670 /* NYTPhotosOverlayView.h in Headers */, @@ -531,7 +531,7 @@ 11FBDA9C1C87753200018169 /* NYTScalingImageView.h in Headers */, 11FBDA921C87753200018169 /* NYTPhotosOverlayView.h in Headers */, 11FBDA8E1C87753200018169 /* NYTPhotoDismissalInteractionController.h in Headers */, - 11FBDAA11C87753200018169 /* NYTPhotosViewControllerDataSource.h in Headers */, + 11FBDAA11C87753200018169 /* NYTPhotoViewerDataSource.h in Headers */, 11FBDA901C87753200018169 /* NYTPhotoViewerArrayDataSource.h in Headers */, 11FBDA9F1C87753200018169 /* NYTPhotoCaptionViewLayoutWidthHinting.h in Headers */, 11FBDA941C87753200018169 /* NYTPhotosViewController.h in Headers */, diff --git a/NYTPhotoViewer/NYTPhotoViewer.h b/NYTPhotoViewer/NYTPhotoViewer.h index 2e6253e6..42d13d4b 100644 --- a/NYTPhotoViewer/NYTPhotoViewer.h +++ b/NYTPhotoViewer/NYTPhotoViewer.h @@ -29,7 +29,7 @@ FOUNDATION_EXPORT const unsigned char NYTPhotoViewerVersionString[]; #import #import #import -#import +#import // Support #import diff --git a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h index 9ae79f94..1fb59fdd 100644 --- a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h +++ b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h @@ -8,14 +8,14 @@ @import Foundation; -#import "NYTPhotosViewControllerDataSource.h" +#import "NYTPhotoViewerDataSource.h" NS_ASSUME_NONNULL_BEGIN /** * A simple concrete implementation of `NYTPhotoViewerDataSource`, for use with an array of images. */ -@interface NYTPhotoViewerArrayDataSource : NSObject +@interface NYTPhotoViewerArrayDataSource : NSObject /** * The designated initializer that takes and stores an array of photos. diff --git a/NYTPhotoViewer/NYTPhotoViewerCore.h b/NYTPhotoViewer/NYTPhotoViewerCore.h index 9de7e896..9579208a 100644 --- a/NYTPhotoViewer/NYTPhotoViewerCore.h +++ b/NYTPhotoViewer/NYTPhotoViewerCore.h @@ -29,7 +29,7 @@ FOUNDATION_EXPORT const unsigned char NYTPhotoViewerCoreVersionString[]; #import #import #import -#import +#import // Support #import diff --git a/NYTPhotoViewer/NYTPhotosViewController.h b/NYTPhotoViewer/NYTPhotosViewController.h index f67a9d6a..4e763ffe 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.h +++ b/NYTPhotoViewer/NYTPhotosViewController.h @@ -138,7 +138,7 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; @end /** - * A protocol of entirely optional methods called for configuration and lifecycle events by an `NYTPhotosViewController` instance. + * A protocol of entirely optional methods called for view-related configuration and lifecycle events by an `NYTPhotosViewController` instance. */ @protocol NYTPhotosViewControllerDelegate @@ -169,7 +169,11 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; - (void)photosViewControllerDidDismiss:(NYTPhotosViewController *)photosViewController; /** - * Returns a view to display over a photo, full width, locked to the bottom, representing the caption for the photo. Can be any `UIView` object, but is expected to respond to `intrinsicContentSize` appropriately to calculate height. + * Returns a view to display over a photo, full width, locked to the bottom, representing the caption for the photo. + * + * Can be any `UIView` object, but the view returned is expected to respond to `intrinsicContentSize` appropriately to calculate height. + * + * @note Your implementation can get caption information from the appropriate properties on the given `NYTPhoto`. * * @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. * @param photo The photo object over which to display the caption view. @@ -181,19 +185,19 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; /** * Returns a string to display as the title in the navigation-bar area for a photo. * - * This small area of the screen is not intended to display a caption or similar information about the photo itself. (NYTPhotoViewer is designed to provide this information in the caption view, and as such the `NYTPhoto` protocol provides properties for the title, summary, and credit for each photo.) Instead, consider using this delegate method to customize how your app displays the user's progress through a set of photos. + * This small area of the screen is not intended to display a caption or similar information about the photo itself. (NYTPhotoViewer is designed to provide this information in the caption view, and as such the `NYTPhoto` protocol provides properties for a title, summary, and credit for each photo.) Instead, consider using this delegate method to customize how your app displays the user's progress through a set of photos. * * @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. * @param photo The photo object for which to display the title. * @param photoIndex The index of the photo. - * @param totalPhotoCount The number of photos being displayed by the photo viewer. + * @param totalPhotoCount The number of photos being displayed by the photo viewer, or `nil` if the total number of photos is not known. The given number packages an `NSInteger`. * * @return The text to display as the navigation-item title for the given photo. Return `nil` to show a default title like "1 of 4" indicating progress in a slideshow, or an empty string to hide this text entirely. */ -- (NSString * _Nullable)photosViewController:(NYTPhotosViewController *)photosViewController titleForPhoto:(id )photo atIndex:(NSUInteger)photoIndex totalPhotoCount:(NSUInteger)totalPhotoCount; +- (NSString * _Nullable)photosViewController:(NYTPhotosViewController *)photosViewController titleForPhoto:(id )photo atIndex:(NSInteger)photoIndex totalPhotoCount:(NSNumber *)totalPhotoCount; /** - * Returns a view to display while a photo is loading. Can be any `UIView` object, but is expected to respond to `sizeToFit` appropriately. This view will be sized and centered in the blank area, and hidden when the photo image is loaded. + * Returns a view to display while a photo is loading. Can be any `UIView` object, but is expected to respond to `sizeToFit` appropriately. This view will be sized and centered in the blank area, and hidden when the photo image or its placeholder is loaded. * * @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. * @param photo The photo object over which to display the activity view. diff --git a/NYTPhotoViewer/NYTPhotosViewController.m b/NYTPhotoViewer/NYTPhotosViewController.m index a0298db4..8a310686 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.m +++ b/NYTPhotoViewer/NYTPhotosViewController.m @@ -7,7 +7,7 @@ // #import "NYTPhotosViewController.h" -#import "NYTPhotosViewControllerDataSource.h" +#import "NYTPhotoViewerDataSource.h" #import "NYTPhotoViewerArrayDataSource.h" #import "NYTPhotoViewController.h" #import "NYTPhotoTransitionController.h" @@ -33,7 +33,7 @@ @interface NYTPhotosViewController () dataSource; +@property (nonatomic) id dataSource; @property (nonatomic) UIPageViewController *pageViewController; @property (nonatomic) NYTPhotoTransitionController *transitionController; @property (nonatomic) UIPopoverController *activityPopoverController; diff --git a/NYTPhotoViewer/Protocols/NYTPhotoViewerDataSource.h b/NYTPhotoViewer/Protocols/NYTPhotoViewerDataSource.h new file mode 100644 index 00000000..6f6ad5b5 --- /dev/null +++ b/NYTPhotoViewer/Protocols/NYTPhotoViewerDataSource.h @@ -0,0 +1,51 @@ +// +// NYTPhotosViewControllerDataSource.h +// NYTPhotoViewer +// +// Created by Brian Capps on 2/10/15. +// Copyright (c) 2015 NYTimes. All rights reserved. +// + +@import UIKit; + +@protocol NYTPhoto; + +NS_ASSUME_NONNULL_BEGIN + +/** + * The data source for an `NYTPhotosViewController` instance. + * + * A view controller, view model, or model in your application could conform to this protocol, depending on what makes sense in your architecture. + * + * Alternatively, `NYTPhotoViewerArrayDataSource` and `NYTPhotoViewerSinglePhotoDataSource` are concrete classes which conveniently handle the most common use cases for NYTPhotoViewer. + */ +@protocol NYTPhotoViewerDataSource + +/** + * The total number of photos in the data source, or `nil` if the number is not known. + * + * The number returned should package an `NSInteger` value. + */ +@property (nonatomic, readonly, nullable) NSNumber *numberOfPhotos; + +/** + * Returns the index of a given photo, or `NSNotFound` if the photo is not in the data source. + * + * @param photo The photo against which to look for the index. + * + * @return The index of a given photo, or `NSNotFound` if the photo is not in the data source. + */ +- (NSInteger)indexOfPhoto:(id )photo; + +/** + * Returns the photo object at a specified index, or `nil` if one does not exist at that index. + * + * @param photoIndex The index of the desired photo. + * + * @return The photo object at a specified index, or `nil` if one does not exist at that index. + */ +- (nullable id )photoAtIndex:(NSInteger)photoIndex; + +@end + +NS_ASSUME_NONNULL_END diff --git a/NYTPhotoViewer/Protocols/NYTPhotosViewControllerDataSource.h b/NYTPhotoViewer/Protocols/NYTPhotosViewControllerDataSource.h deleted file mode 100644 index cf8a007b..00000000 --- a/NYTPhotoViewer/Protocols/NYTPhotosViewControllerDataSource.h +++ /dev/null @@ -1,60 +0,0 @@ -// -// NYTPhotosViewControllerDataSource.h -// NYTPhotoViewer -// -// Created by Brian Capps on 2/10/15. -// Copyright (c) 2015 NYTimes. All rights reserved. -// - -@import UIKit; - -@protocol NYTPhoto; - -/** - * A protocol defining methods that must exist on a data source for an `NYTPhotosViewController`. - */ -@protocol NYTPhotosViewControllerDataSource - -/** - * The total number of photos in the data source. - */ -@property (nonatomic, readonly) NSUInteger numberOfPhotos; - -/** - * Returns the photo object at a specified index, or `nil` if one does not exist at that index. - * - * @param photoIndex The index of the desired photo. - * - * @return The photo object at a specified index, or `nil` if one does not exist at that index. - */ -- (id )photoAtIndex:(NSUInteger)photoIndex; - -/** - * Returns the index of a given photo, or `NSNotFound` if the photo is ot in the data source. - * - * @param photo The photo against which to look for the index. - * - * @return The index of a given photo, or `NSNotFound` if the photo is ot in the data source. - */ -- (NSUInteger)indexOfPhoto:(id )photo; - -/** - * Returns a `BOOL` representing whether the data source contains the passed-in photo. - * - * @param photo The photo to check existence of in the data source. - * - * @return A `BOOL` representing whether the data source contains the passed-in photo. - */ -- (BOOL)containsPhoto:(id )photo; - -/** - * Subscripting support. For example, `dataSource[0]` will be a valid way to obtain the photo at index 0. - * @note Indexes outside the range of the data source are expected to return `nil` and not to crash. - * - * @param photoIndex The index of the photo. - * - * @return The photo at the index, or `nil` if there is none. - */ -- (id )objectAtIndexedSubscript:(NSUInteger)photoIndex; - -@end From d1394c6dc5cb406934298f9b88f16c951a3e7c35 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 9 Dec 2016 16:40:05 -0500 Subject: [PATCH 07/55] [minor] Improve comments in `NYTPhoto.h` --- NYTPhotoViewer/Protocols/NYTPhoto.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/NYTPhotoViewer/Protocols/NYTPhoto.h b/NYTPhotoViewer/Protocols/NYTPhoto.h index 0541a3d7..c3ae31ab 100644 --- a/NYTPhotoViewer/Protocols/NYTPhoto.h +++ b/NYTPhotoViewer/Protocols/NYTPhoto.h @@ -34,10 +34,12 @@ NS_ASSUME_NONNULL_BEGIN /** * A placeholder image for display while the image is loading. * - * This property is used if and only if `-imageData` returns `nil`. + * This property is used if and only if `-imageData` and `-image` return `nil`. */ @property (nonatomic, readonly, nullable) UIImage *placeholderImage; +#pragma mark Caption + /** * An attributed string for display as the title of the caption. */ From e615a09dd15c59bc64d3021c69d8f82d2bcfb812 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 9 Dec 2016 20:06:12 -0500 Subject: [PATCH 08/55] Update library code to work with new `NYTPhotoViewerDataSource` --- .../NYTPhotoViewerArrayDataSource.m | 8 ++++---- NYTPhotoViewer/NYTPhotosViewController.h | 2 +- NYTPhotoViewer/NYTPhotosViewController.m | 20 +++++++++---------- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m index 282ca128..2d139bda 100644 --- a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m +++ b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m @@ -42,11 +42,11 @@ - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state object #pragma mark - NYTPhotosViewControllerDataSource -- (NSUInteger)numberOfPhotos { - return self.photos.count; +- (NSNumber *)numberOfPhotos { + return @(self.photos.count); } -- (id )photoAtIndex:(NSUInteger)photoIndex { +- (id )photoAtIndex:(NSInteger)photoIndex { if (photoIndex < self.photos.count) { return self.photos[photoIndex]; } @@ -54,7 +54,7 @@ - (NSUInteger)numberOfPhotos { return nil; } -- (NSUInteger)indexOfPhoto:(id )photo { +- (NSInteger)indexOfPhoto:(id )photo { return [self.photos indexOfObject:photo]; } diff --git a/NYTPhotoViewer/NYTPhotosViewController.h b/NYTPhotoViewer/NYTPhotosViewController.h index 4e763ffe..9739730c 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.h +++ b/NYTPhotoViewer/NYTPhotosViewController.h @@ -194,7 +194,7 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; * * @return The text to display as the navigation-item title for the given photo. Return `nil` to show a default title like "1 of 4" indicating progress in a slideshow, or an empty string to hide this text entirely. */ -- (NSString * _Nullable)photosViewController:(NYTPhotosViewController *)photosViewController titleForPhoto:(id )photo atIndex:(NSInteger)photoIndex totalPhotoCount:(NSNumber *)totalPhotoCount; +- (NSString * _Nullable)photosViewController:(NYTPhotosViewController *)photosViewController titleForPhoto:(id )photo atIndex:(NSInteger)photoIndex totalPhotoCount:(nullable NSNumber *)totalPhotoCount; /** * Returns a view to display while a photo is loading. Can be any `UIView` object, but is expected to respond to `sizeToFit` appropriately. This view will be sized and centered in the blank area, and hidden when the photo image or its placeholder is loaded. diff --git a/NYTPhotoViewer/NYTPhotosViewController.m b/NYTPhotoViewer/NYTPhotosViewController.m index 8a310686..57583e30 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.m +++ b/NYTPhotoViewer/NYTPhotosViewController.m @@ -203,7 +203,7 @@ - (void)setupPageViewControllerWithInitialPhoto:(id )initialPhoto { NYTPhotoViewController *initialPhotoViewController; - if ([self.dataSource containsPhoto:initialPhoto]) { + if ([self.dataSource indexOfPhoto:initialPhoto] != NSNotFound) { initialPhotoViewController = [self newPhotoViewControllerForPhoto:initialPhoto]; } else { @@ -228,21 +228,19 @@ - (void)addOverlayView { - (void)updateOverlayInformation { NSString *overlayTitle; - NSUInteger photoIndex = [self.dataSource indexOfPhoto:self.currentlyDisplayedPhoto]; + NSInteger displayIndex = photoIndex + 1; if ([self.delegate respondsToSelector:@selector(photosViewController:titleForPhoto:atIndex:totalPhotoCount:)]) { overlayTitle = [self.delegate photosViewController:self titleForPhoto:self.currentlyDisplayedPhoto atIndex:photoIndex totalPhotoCount:self.dataSource.numberOfPhotos]; } - - if (!overlayTitle && self.dataSource.numberOfPhotos > 1) { - NSUInteger displayIndex = 1; - - if (photoIndex < self.dataSource.numberOfPhotos) { - displayIndex = photoIndex + 1; - } - overlayTitle = [NSString localizedStringWithFormat:NSLocalizedString(@"%lu of %lu", nil), (unsigned long)displayIndex, (unsigned long)self.dataSource.numberOfPhotos]; + if (!overlayTitle && self.dataSource.numberOfPhotos == nil) { + overlayTitle = [NSString localizedStringWithFormat:@"%lu", (unsigned long)displayIndex]; + } + + if (!overlayTitle && self.dataSource.numberOfPhotos.integerValue > 1) { + overlayTitle = [NSString localizedStringWithFormat:NSLocalizedString(@"%lu of %lu", nil), (unsigned long)displayIndex, (unsigned long)self.dataSource.numberOfPhotos.integerValue]; } self.overlayView.title = overlayTitle; @@ -328,7 +326,7 @@ - (void)setRightBarButtonItems:(NSArray *)rightBarButtonItems { } - (void)displayPhoto:(id )photo animated:(BOOL)animated { - if (![self.dataSource containsPhoto:photo]) { + if ([self.dataSource indexOfPhoto:photo] == NSNotFound) { return; } From 26524742d7f1cc0f3bc627eed59603f1f19f78a7 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 9 Dec 2016 20:06:39 -0500 Subject: [PATCH 09/55] Update Example app to work with new `NYTPhotoViewerDataSource` --- Example/NYTViewController.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Example/NYTViewController.m b/Example/NYTViewController.m index 28823f09..dc577b20 100644 --- a/Example/NYTViewController.m +++ b/Example/NYTViewController.m @@ -155,9 +155,9 @@ - (NSDictionary *)photosViewController:(NYTPhotosViewController *)photosViewCont return nil; } -- (NSString *)photosViewController:(NYTPhotosViewController *)photosViewController titleForPhoto:(id)photo atIndex:(NSUInteger)photoIndex totalPhotoCount:(NSUInteger)totalPhotoCount { +- (NSString *)photosViewController:(NYTPhotosViewController *)photosViewController titleForPhoto:(id)photo atIndex:(NSInteger)photoIndex totalPhotoCount:(nullable NSNumber *)totalPhotoCount { if ([photo isEqual:self.photos[NYTViewControllerPhotoIndexCustomEverything]]) { - return [NSString stringWithFormat:@"%lu/%lu", (unsigned long)photoIndex+1, (unsigned long)totalPhotoCount]; + return [NSString stringWithFormat:@"%lu/%lu", (unsigned long)photoIndex+1, (unsigned long)totalPhotoCount.integerValue]; } return nil; From fbbdda3594a9dca7850e6b956740589851cab26e Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Thu, 19 Jan 2017 17:19:22 -0500 Subject: [PATCH 10/55] Use Swift3 API to create a DispatchTime - thanks @zadr --- Example-Swift/ViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Example-Swift/ViewController.swift b/Example-Swift/ViewController.swift index 223bd657..85eef373 100755 --- a/Example-Swift/ViewController.swift +++ b/Example-Swift/ViewController.swift @@ -25,7 +25,7 @@ class ViewController: UIViewController, NYTPhotosViewControllerDelegate { func updateImagesOnPhotosViewController(_ photosViewController: NYTPhotosViewController, afterDelayWithPhotos: [ExamplePhoto]) { - let delayTime = DispatchTime.now() + Double(5 * Int64(NSEC_PER_SEC)) / Double(NSEC_PER_SEC) + let delayTime = DispatchTime.now() + 5.0 DispatchQueue.main.asyncAfter(deadline: delayTime) { for photo in self.photos { From 577aa89c5e20061c432a3d28266df562baa191a9 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Thu, 26 Jan 2017 16:20:56 -0500 Subject: [PATCH 11/55] Clean up ArrayDataSource interface --- NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h | 8 ++++++-- NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m | 18 +++++------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h index 1fb59fdd..8e9de345 100644 --- a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h +++ b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h @@ -15,7 +15,9 @@ NS_ASSUME_NONNULL_BEGIN /** * A simple concrete implementation of `NYTPhotoViewerDataSource`, for use with an array of images. */ -@interface NYTPhotoViewerArrayDataSource : NSObject +@interface NYTPhotoViewerArrayDataSource : NSObject + +@property (nonatomic, readonly) NSArray> *photos; /** * The designated initializer that takes and stores an array of photos. @@ -24,7 +26,9 @@ NS_ASSUME_NONNULL_BEGIN * * @return A fully initialized object. */ -- (instancetype)initWithPhotos:(nullable NSArray *)photos NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithPhotos:(nullable NSArray> *)photos NS_DESIGNATED_INITIALIZER; + +- (id)objectAtIndexedSubscript:(NSUInteger)idx; @end diff --git a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m index 2d139bda..78d7f25e 100644 --- a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m +++ b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m @@ -8,12 +8,6 @@ #import "NYTPhotoViewerArrayDataSource.h" -@interface NYTPhotoViewerArrayDataSource () - -@property (nonatomic, readonly) NSArray *photos; - -@end - @implementation NYTPhotoViewerArrayDataSource #pragma mark - NSObject @@ -24,7 +18,7 @@ - (instancetype)init { #pragma mark - NYTPhotosDataSource -- (instancetype)initWithPhotos:(NSArray *)photos { +- (instancetype)initWithPhotos:(nullable NSArray> *)photos { self = [super init]; if (self) { @@ -46,7 +40,7 @@ - (NSNumber *)numberOfPhotos { return @(self.photos.count); } -- (id )photoAtIndex:(NSInteger)photoIndex { +- (nullable id )photoAtIndex:(NSInteger)photoIndex { if (photoIndex < self.photos.count) { return self.photos[photoIndex]; } @@ -58,12 +52,10 @@ - (NSInteger)indexOfPhoto:(id )photo { return [self.photos indexOfObject:photo]; } -- (BOOL)containsPhoto:(id )photo { - return [self.photos containsObject:photo]; -} +#pragma mark - Subscripting -- (id )objectAtIndexedSubscript:(NSUInteger)photoIndex { - return [self photoAtIndex:photoIndex]; +- (id)objectAtIndexedSubscript:(NSUInteger)idx { + return self.photos[idx]; } @end From ae015e23ade970df645c24fc3d92f0039ce65ec1 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Thu, 26 Jan 2017 16:21:09 -0500 Subject: [PATCH 12/55] Add factory method for ArrayDataSource --- NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h | 2 ++ NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h index 8e9de345..d59b33fb 100644 --- a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h +++ b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h @@ -28,6 +28,8 @@ NS_ASSUME_NONNULL_BEGIN */ - (instancetype)initWithPhotos:(nullable NSArray> *)photos NS_DESIGNATED_INITIALIZER; ++ (instancetype)dataSourceWithPhotos:(nullable NSArray> *)photos; + - (id)objectAtIndexedSubscript:(NSUInteger)idx; @end diff --git a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m index 78d7f25e..dccd48dc 100644 --- a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m +++ b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m @@ -28,6 +28,10 @@ - (instancetype)initWithPhotos:(nullable NSArray> *)photos { return self; } ++ (instancetype)dataSourceWithPhotos:(nullable NSArray> *)photos { + return [[self alloc] initWithPhotos:photos]; +} + #pragma mark - NSFastEnumeration - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(__unsafe_unretained id [])buffer count:(NSUInteger)length { From 620540d42c6ac848f144b2eb30c6f3297bd08648 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Thu, 26 Jan 2017 16:21:20 -0500 Subject: [PATCH 13/55] Handle null input properly in ArrayDataSource --- NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m index dccd48dc..68cc209c 100644 --- a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m +++ b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m @@ -22,7 +22,11 @@ - (instancetype)initWithPhotos:(nullable NSArray> *)photos { self = [super init]; if (self) { - _photos = [photos copy]; + if (photos == nil) { + _photos = @[]; + } else { + _photos = [photos copy]; + } } return self; From 207a44885f389f00cb439234d815ab850bf7710d Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Thu, 26 Jan 2017 16:21:52 -0500 Subject: [PATCH 14/55] NYTPhotosViewController takes a data source, not an array --- Example/NYTViewController.m | 29 ++++++++-------- NYTPhotoViewer/NYTPhotosViewController.h | 43 ++++++++++-------------- NYTPhotoViewer/NYTPhotosViewController.m | 34 +++++++++---------- 3 files changed, 49 insertions(+), 57 deletions(-) diff --git a/Example/NYTViewController.m b/Example/NYTViewController.m index dc577b20..34969c8e 100644 --- a/Example/NYTViewController.m +++ b/Example/NYTViewController.m @@ -8,6 +8,7 @@ #import "NYTViewController.h" #import +#import #import "NYTExamplePhoto.h" typedef NS_ENUM(NSUInteger, NYTViewControllerPhotoIndex) { @@ -23,30 +24,30 @@ typedef NS_ENUM(NSUInteger, NYTViewControllerPhotoIndex) { @interface NYTViewController () @property (weak, nonatomic) IBOutlet UIButton *imageButton; -@property (nonatomic) NSArray *photos; +@property (nonatomic) NYTPhotoViewerArrayDataSource *dataSource; @end @implementation NYTViewController - (IBAction)imageButtonTapped:(id)sender { - self.photos = [[self class] newTestPhotos]; - - NYTPhotosViewController *photosViewController = [[NYTPhotosViewController alloc] initWithPhotos:self.photos initialPhoto:nil delegate:self]; + self.dataSource = [NYTPhotoViewerArrayDataSource dataSourceWithPhotos:[self.class newTestPhotos]]; + + NYTPhotosViewController *photosViewController = [[NYTPhotosViewController alloc] initWithDataSource:self.dataSource initialPhoto:nil delegate:self]; [self presentViewController:photosViewController animated:YES completion:nil]; - [self updateImagesOnPhotosViewController:photosViewController afterDelayWithPhotos:self.photos]; + [self updateImagesOnPhotosViewController:photosViewController afterDelayWithDataSource:self.dataSource]; } // This method simulates previously blank photos loading their images after some time. -- (void)updateImagesOnPhotosViewController:(NYTPhotosViewController *)photosViewController afterDelayWithPhotos:(NSArray *)photos { +- (void)updateImagesOnPhotosViewController:(NYTPhotosViewController *)photosViewController afterDelayWithDataSource:(NYTPhotoViewerArrayDataSource *)dataSource { CGFloat updateImageDelay = 5.0; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(updateImageDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - for (NYTExamplePhoto *photo in photos) { + for (NYTExamplePhoto *photo in dataSource.photos) { if (!photo.image && !photo.imageData) { photo.image = [UIImage imageNamed:@"NYTimesBuilding"]; - [photosViewController updateImageForPhoto:photo]; +// [photosViewController updateImageForPhoto:photo]; } } }); @@ -109,7 +110,7 @@ + (NSArray *)newTestPhotos { #pragma mark - NYTPhotosViewControllerDelegate - (UIView *)photosViewController:(NYTPhotosViewController *)photosViewController referenceViewForPhoto:(id )photo { - if ([photo isEqual:self.photos[NYTViewControllerPhotoIndexNoReferenceView]]) { + if ([photo isEqual:self.dataSource[NYTViewControllerPhotoIndexNoReferenceView]]) { return nil; } @@ -117,7 +118,7 @@ - (UIView *)photosViewController:(NYTPhotosViewController *)photosViewController } - (UIView *)photosViewController:(NYTPhotosViewController *)photosViewController loadingViewForPhoto:(id )photo { - if ([photo isEqual:self.photos[NYTViewControllerPhotoIndexCustomEverything]]) { + if ([photo isEqual:self.dataSource.photos[NYTViewControllerPhotoIndexCustomEverything]]) { UILabel *loadingLabel = [[UILabel alloc] init]; loadingLabel.text = @"Custom Loading..."; loadingLabel.textColor = [UIColor greenColor]; @@ -128,7 +129,7 @@ - (UIView *)photosViewController:(NYTPhotosViewController *)photosViewController } - (UIView *)photosViewController:(NYTPhotosViewController *)photosViewController captionViewForPhoto:(id )photo { - if ([photo isEqual:self.photos[NYTViewControllerPhotoIndexCustomEverything]]) { + if ([photo isEqual:self.dataSource.photos[NYTViewControllerPhotoIndexCustomEverything]]) { UILabel *label = [[UILabel alloc] init]; label.text = @"Custom Caption View"; label.textColor = [UIColor whiteColor]; @@ -140,7 +141,7 @@ - (UIView *)photosViewController:(NYTPhotosViewController *)photosViewController } - (CGFloat)photosViewController:(NYTPhotosViewController *)photosViewController maximumZoomScaleForPhoto:(id )photo { - if ([photo isEqual:self.photos[NYTViewControllerPhotoIndexCustomMaxZoomScale]]) { + if ([photo isEqual:self.dataSource.photos[NYTViewControllerPhotoIndexCustomMaxZoomScale]]) { return 10.0f; } @@ -148,7 +149,7 @@ - (CGFloat)photosViewController:(NYTPhotosViewController *)photosViewController } - (NSDictionary *)photosViewController:(NYTPhotosViewController *)photosViewController overlayTitleTextAttributesForPhoto:(id )photo { - if ([photo isEqual:self.photos[NYTViewControllerPhotoIndexCustomEverything]]) { + if ([photo isEqual:self.dataSource.photos[NYTViewControllerPhotoIndexCustomEverything]]) { return @{NSForegroundColorAttributeName: [UIColor grayColor]}; } @@ -156,7 +157,7 @@ - (NSDictionary *)photosViewController:(NYTPhotosViewController *)photosViewCont } - (NSString *)photosViewController:(NYTPhotosViewController *)photosViewController titleForPhoto:(id)photo atIndex:(NSInteger)photoIndex totalPhotoCount:(nullable NSNumber *)totalPhotoCount { - if ([photo isEqual:self.photos[NYTViewControllerPhotoIndexCustomEverything]]) { + if ([photo isEqual:self.dataSource.photos[NYTViewControllerPhotoIndexCustomEverything]]) { return [NSString stringWithFormat:@"%lu/%lu", (unsigned long)photoIndex+1, (unsigned long)totalPhotoCount.integerValue]; } diff --git a/NYTPhotoViewer/NYTPhotosViewController.h b/NYTPhotoViewer/NYTPhotosViewController.h index 9739730c..81598c13 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.h +++ b/NYTPhotoViewer/NYTPhotosViewController.h @@ -12,6 +12,7 @@ @protocol NYTPhoto; @protocol NYTPhotosViewControllerDelegate; +@protocol NYTPhotoViewerDataSource; NS_ASSUME_NONNULL_BEGIN @@ -53,8 +54,15 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; */ @property (nonatomic, readonly, nullable) UIPageViewController *pageViewController; +/** + * The data source underlying this PhotosViewController. + */ +@property (nonatomic, readonly) id dataSource; + /** * The object conforming to `NYTPhoto` that is currently being displayed by the `pageViewController`. + * + * This photo will be one of the photos from the data source. */ @property (nonatomic, readonly, nullable) id currentlyDisplayedPhoto; @@ -91,34 +99,26 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; @property (nonatomic, weak, nullable) id delegate; /** - * A convenience initializer that calls `initWithPhotos:initialPhoto:delegate:`, passing the first photo as the `initialPhoto` argument, and `nil` as the `delegate` argument. - * - * @param photos An array of objects conforming to the `NYTPhoto` protocol. - * - * @return A fully initialized object. - */ -- (instancetype)initWithPhotos:(NSArray > * _Nullable)photos; - -/** - * A convenience initializer that calls `initWithPhotos:initialPhoto:delegate:`, passing `nil` as the `delegate` argument. + * Initializes a `PhotosViewController` with the given data source and delegate, initially displaying the photo at the given index in the data source. * - * @param photos An array of objects conforming to the `NYTPhoto` protocol. - * @param initialPhoto The photo to display initially. Must be contained within the `photos` array. If `nil` or not within the `photos` array, the first photo within the `photos` array will be displayed. + * @param dataSource The data source underlying this photo viewer. + * @param initialPhotoIndex The photo to display initially. If outside the bounds of the data source, the first photo from the data source will be displayed. + * @param delegate The delegate for this `NYTPhotosViewController`. * * @return A fully initialized object. */ -- (instancetype)initWithPhotos:(NSArray > * _Nullable)photos initialPhoto:(id _Nullable)initialPhoto; +- (instancetype)initWithDataSource:(id )dataSource initialPhotoIndex:(NSInteger)initialPhotoIndex delegate:(nullable id )delegate; /** - * The designated initializer that stores the array of objects conforming to the `NYTPhoto` protocol for display, along with specifying an initial photo for display. + * Initializes a `PhotosViewController` with the given data source and delegate, initially displaying the given photo. * - * @param photos An array of objects conforming to the `NYTPhoto` protocol. - * @param initialPhoto The photo to display initially. Must be contained within the `photos` array. If `nil` or not within the `photos` array, the first photo within the `photos` array will be displayed. - * @param delegate The delegate for this `NYTPhotosViewController`. + * @param dataSource The data source underlying this photo viewer. + * @param initialPhoto The photo to display initially. Must be a member of the data source. If `nil` or not a member of the data source, the first photo from the data source will be displayed. + * @param delegate The delegate for this `NYTPhotosViewController`. * * @return A fully initialized object. */ -- (instancetype)initWithPhotos:(NSArray > * _Nullable)photos initialPhoto:(id _Nullable)initialPhoto delegate:(nullable id )delegate NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithDataSource:(id )dataSource initialPhoto:(id _Nullable)initialPhoto delegate:(nullable id )delegate NS_DESIGNATED_INITIALIZER; /** * Displays the specified photo. Can be called before the view controller is displayed. Calling with a photo not contained within the data source has no effect. @@ -128,13 +128,6 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; */ - (void)displayPhoto:(id _Nullable)photo animated:(BOOL)animated; -/** - * Update the image displayed for the given photo object. - * - * @param photo The photo for which to display the new image. - */ -- (void)updateImageForPhoto:(id _Nullable)photo; - @end /** diff --git a/NYTPhotoViewer/NYTPhotosViewController.m b/NYTPhotoViewer/NYTPhotosViewController.m index 57583e30..4ad56060 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.m +++ b/NYTPhotoViewer/NYTPhotosViewController.m @@ -33,7 +33,6 @@ @interface NYTPhotosViewController () dataSource; @property (nonatomic) UIPageViewController *pageViewController; @property (nonatomic) NYTPhotoTransitionController *transitionController; @property (nonatomic) UIPopoverController *activityPopoverController; @@ -87,14 +86,14 @@ - (BOOL)canPerformAction:(SEL)action withSender:(id)sender { #pragma mark - UIViewController - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - return [self initWithPhotos:nil]; + return [self initWithDataSource:[NYTPhotoViewerArrayDataSource dataSourceWithPhotos:@[]] initialPhoto:nil delegate:nil]; } - (instancetype)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { - [self commonInitWithPhotos:nil initialPhoto:nil delegate:nil]; + [self commonInitWithDataSource:[NYTPhotoViewerArrayDataSource dataSourceWithPhotos:@[]] initialPhoto:nil delegate:nil]; } return self; @@ -155,26 +154,25 @@ - (void)dismissViewControllerAnimated:(BOOL)animated completion:(void (^)(void)) #pragma mark - NYTPhotosViewController -- (instancetype)initWithPhotos:(NSArray *)photos { - return [self initWithPhotos:photos initialPhoto:photos.firstObject delegate:nil]; -} +- (instancetype)initWithDataSource:(id )dataSource initialPhotoIndex:(NSInteger)initialPhotoIndex delegate:(nullable id )delegate { + id initialPhoto = [dataSource photoAtIndex:initialPhotoIndex]; -- (instancetype)initWithPhotos:(NSArray *)photos initialPhoto:(id )initialPhoto { - return [self initWithPhotos:photos initialPhoto:initialPhoto delegate:nil]; + self = [self initWithDataSource:dataSource initialPhoto:initialPhoto delegate:delegate]; + return self; } -- (instancetype)initWithPhotos:(NSArray *)photos initialPhoto:(id )initialPhoto delegate:(id)delegate { +- (instancetype)initWithDataSource:(id )dataSource initialPhoto:(id _Nullable)initialPhoto delegate:(nullable id )delegate { self = [super initWithNibName:nil bundle:nil]; if (self) { - [self commonInitWithPhotos:photos initialPhoto:initialPhoto delegate:delegate]; + [self commonInitWithDataSource:dataSource initialPhoto:initialPhoto delegate:delegate]; } return self; } -- (void)commonInitWithPhotos:(NSArray *)photos initialPhoto:(id )initialPhoto delegate:(id)delegate { - _dataSource = [[NYTPhotoViewerArrayDataSource alloc] initWithPhotos:photos]; +- (void)commonInitWithDataSource:(id )dataSource initialPhoto:(id _Nullable)initialPhoto delegate:(nullable id )delegate { + _dataSource = dataSource; _delegate = delegate; _panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(didPanWithGestureRecognizer:)]; @@ -207,7 +205,7 @@ - (void)setupPageViewControllerWithInitialPhoto:(id )initialPhoto { initialPhotoViewController = [self newPhotoViewControllerForPhoto:initialPhoto]; } else { - initialPhotoViewController = [self newPhotoViewControllerForPhoto:self.dataSource[0]]; + initialPhotoViewController = [self newPhotoViewControllerForPhoto:[self.dataSource photoAtIndex:0]]; } [self setCurrentlyDisplayedViewController:initialPhotoViewController animated:NO]; @@ -335,9 +333,9 @@ - (void)displayPhoto:(id )photo animated:(BOOL)animated { [self updateOverlayInformation]; } -- (void)updateImageForPhoto:(id )photo { - [self.notificationCenter postNotificationName:NYTPhotoViewControllerPhotoImageUpdatedNotification object:photo]; -} +//- (void)updateImageForPhoto:(id )photo { +// [self.notificationCenter postNotificationName:NYTPhotoViewControllerPhotoImageUpdatedNotification object:photo]; +//} #pragma mark - Gesture Recognizers @@ -513,12 +511,12 @@ - (void)photoViewController:(NYTPhotoViewController *)photoViewController didLon - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { NSUInteger photoIndex = [self.dataSource indexOfPhoto:viewController.photo]; - return [self newPhotoViewControllerForPhoto:self.dataSource[photoIndex - 1]]; + return [self newPhotoViewControllerForPhoto:[self.dataSource photoAtIndex:(photoIndex - 1)]]; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { NSUInteger photoIndex = [self.dataSource indexOfPhoto:viewController.photo]; - return [self newPhotoViewControllerForPhoto:self.dataSource[photoIndex + 1]]; + return [self newPhotoViewControllerForPhoto:[self.dataSource photoAtIndex:(photoIndex + 1)]]; } #pragma mark - UIPageViewControllerDelegate From 3e0dba9f88481315afe3e25710cc4ef028542216 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Thu, 26 Jan 2017 17:01:39 -0500 Subject: [PATCH 15/55] Allow informing PhotosVC that an individual photo has changed --- Example/NYTViewController.m | 3 ++- NYTPhotoViewer/NYTPhotosViewController.h | 16 ++++++++++++++++ NYTPhotoViewer/NYTPhotosViewController.m | 24 +++++++++++++++++++++--- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/Example/NYTViewController.m b/Example/NYTViewController.m index 34969c8e..98236c99 100644 --- a/Example/NYTViewController.m +++ b/Example/NYTViewController.m @@ -47,7 +47,8 @@ - (void)updateImagesOnPhotosViewController:(NYTPhotosViewController *)photosView for (NYTExamplePhoto *photo in dataSource.photos) { if (!photo.image && !photo.imageData) { photo.image = [UIImage imageNamed:@"NYTimesBuilding"]; -// [photosViewController updateImageForPhoto:photo]; + photo.attributedCaptionSummary = [[NSAttributedString alloc] initWithString:@"photo which previously had a loading spinner (reopen the photo viewer and scroll to here to see it)" attributes:@{NSForegroundColorAttributeName: [UIColor whiteColor], NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleBody]}]; + [photosViewController updatePhoto:photo]; } } }); diff --git a/NYTPhotoViewer/NYTPhotosViewController.h b/NYTPhotoViewer/NYTPhotosViewController.h index 81598c13..09c4b813 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.h +++ b/NYTPhotoViewer/NYTPhotosViewController.h @@ -128,6 +128,22 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; */ - (void)displayPhoto:(id _Nullable)photo animated:(BOOL)animated; +/** + * Informs the photo viewer that the photo in the data source at this index has changed. + * + * In response, the photo viewer will retrieve and update the overlay information and the photo itself. + */ +- (void)updatePhotoAtIndex:(NSInteger)photoIndex; + +/** + * Informs the photo viewer that the given photo in the data source has changed. + * + * In response, the photo viewer will retrieve and update the overlay information and the photo itself. + * + * This method has no effect if the photo doesn't exist in the data source. + */ +- (void)updatePhoto:(id)photo; + @end /** diff --git a/NYTPhotoViewer/NYTPhotosViewController.m b/NYTPhotoViewer/NYTPhotosViewController.m index 4ad56060..e09e43b1 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.m +++ b/NYTPhotoViewer/NYTPhotosViewController.m @@ -333,9 +333,27 @@ - (void)displayPhoto:(id )photo animated:(BOOL)animated { [self updateOverlayInformation]; } -//- (void)updateImageForPhoto:(id )photo { -// [self.notificationCenter postNotificationName:NYTPhotoViewControllerPhotoImageUpdatedNotification object:photo]; -//} +- (void)updatePhotoAtIndex:(NSInteger)photoIndex { + id photo = [self.dataSource photoAtIndex:photoIndex]; + if (!photo) { + return; + } + + [self updatePhoto:photo]; +} + +- (void)updatePhoto:(id)photo { + if ([self.dataSource indexOfPhoto:photo] == NSNotFound) { + return; + } + + [self.notificationCenter postNotificationName:NYTPhotoViewControllerPhotoImageUpdatedNotification object:photo]; + + id currentViewController = self.pageViewController.viewControllers.firstObject; + if (currentViewController.photo == photo) { + [self updateOverlayInformation]; + } +} #pragma mark - Gesture Recognizers From de002c11c014ffb75fb06613dce0f8b17622b7f8 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 27 Jan 2017 10:28:10 -0500 Subject: [PATCH 16/55] Better document updatePhotoAtIndex: behavior --- NYTPhotoViewer/NYTPhotosViewController.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NYTPhotoViewer/NYTPhotosViewController.h b/NYTPhotoViewer/NYTPhotosViewController.h index 09c4b813..1e5d1f12 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.h +++ b/NYTPhotoViewer/NYTPhotosViewController.h @@ -132,6 +132,8 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; * Informs the photo viewer that the photo in the data source at this index has changed. * * In response, the photo viewer will retrieve and update the overlay information and the photo itself. + * + * This method has no effect if the given index is out of bounds in the data source. */ - (void)updatePhotoAtIndex:(NSInteger)photoIndex; From ed8f246dd9e6d5a549d38fafd13ed1b6295acd01 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 27 Jan 2017 10:28:33 -0500 Subject: [PATCH 17/55] =?UTF-8?q?refactor:=20use=20a=20property=20that?= =?UTF-8?q?=E2=80=99s=20already=20been=20implemented?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NYTPhotoViewer/NYTPhotosViewController.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/NYTPhotoViewer/NYTPhotosViewController.m b/NYTPhotoViewer/NYTPhotosViewController.m index e09e43b1..37dc7b63 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.m +++ b/NYTPhotoViewer/NYTPhotosViewController.m @@ -349,8 +349,7 @@ - (void)updatePhoto:(id)photo { [self.notificationCenter postNotificationName:NYTPhotoViewControllerPhotoImageUpdatedNotification object:photo]; - id currentViewController = self.pageViewController.viewControllers.firstObject; - if (currentViewController.photo == photo) { + if (self.currentlyDisplayedPhoto == photo) { [self updateOverlayInformation]; } } From b0a95255de4c5f7d8a00003d37a27e6f54042909 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 27 Jan 2017 11:59:06 -0500 Subject: [PATCH 18/55] Add another example photo --- .../AppIcon.appiconset/Contents.json | 10 ++++++++ .../Chess.imageset/Contents.json | 23 ++++++++++++++++++ .../Chess.imageset/dzombak-chess-1.jpg | Bin 0 -> 124858 bytes .../Chess.imageset/dzombak-chess-2.jpg | Bin 0 -> 124858 bytes .../Chess.imageset/dzombak-chess.jpg | Bin 0 -> 124858 bytes 5 files changed, 33 insertions(+) create mode 100644 Example/Assets.xcassets/Chess.imageset/Contents.json create mode 100644 Example/Assets.xcassets/Chess.imageset/dzombak-chess-1.jpg create mode 100644 Example/Assets.xcassets/Chess.imageset/dzombak-chess-2.jpg create mode 100644 Example/Assets.xcassets/Chess.imageset/dzombak-chess.jpg diff --git a/Example/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example/Assets.xcassets/AppIcon.appiconset/Contents.json index 118c98f7..b8236c65 100644 --- a/Example/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Example/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "29x29", diff --git a/Example/Assets.xcassets/Chess.imageset/Contents.json b/Example/Assets.xcassets/Chess.imageset/Contents.json new file mode 100644 index 00000000..9107d8f1 --- /dev/null +++ b/Example/Assets.xcassets/Chess.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "dzombak-chess.jpg", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "dzombak-chess-1.jpg", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "dzombak-chess-2.jpg", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/Assets.xcassets/Chess.imageset/dzombak-chess-1.jpg b/Example/Assets.xcassets/Chess.imageset/dzombak-chess-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0f750472584c73c1468a860069f0ee5bc511b061 GIT binary patch literal 124858 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 literal 0 HcmV?d00001 diff --git a/Example/Assets.xcassets/Chess.imageset/dzombak-chess-2.jpg b/Example/Assets.xcassets/Chess.imageset/dzombak-chess-2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0f750472584c73c1468a860069f0ee5bc511b061 GIT binary patch literal 124858 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 literal 0 HcmV?d00001 diff --git a/Example/Assets.xcassets/Chess.imageset/dzombak-chess.jpg b/Example/Assets.xcassets/Chess.imageset/dzombak-chess.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0f750472584c73c1468a860069f0ee5bc511b061 GIT binary patch literal 124858 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 literal 0 HcmV?d00001 From 762483b008188f2cdf4d41e6bd965aa5daab39b4 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 27 Jan 2017 12:00:10 -0500 Subject: [PATCH 19/55] Better document updatePhoto: methods --- NYTPhotoViewer/NYTPhotosViewController.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NYTPhotoViewer/NYTPhotosViewController.h b/NYTPhotoViewer/NYTPhotosViewController.h index 1e5d1f12..8e2797c3 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.h +++ b/NYTPhotoViewer/NYTPhotosViewController.h @@ -134,6 +134,8 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; * In response, the photo viewer will retrieve and update the overlay information and the photo itself. * * This method has no effect if the given index is out of bounds in the data source. + * + * @param photo The index of the photo which changed in the data source. */ - (void)updatePhotoAtIndex:(NSInteger)photoIndex; @@ -143,6 +145,8 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; * In response, the photo viewer will retrieve and update the overlay information and the photo itself. * * This method has no effect if the photo doesn't exist in the data source. + * + * @param photo The photo which changed in the data source. */ - (void)updatePhoto:(id)photo; From 587c82b66508d9c062ab0985370d281e814680cd Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 27 Jan 2017 12:01:36 -0500 Subject: [PATCH 20/55] Allow setting `NYTPhotosVC` data source --- NYTPhotoViewer/NYTPhotosViewController.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/NYTPhotoViewer/NYTPhotosViewController.h b/NYTPhotoViewer/NYTPhotosViewController.h index 8e2797c3..083a9ff3 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.h +++ b/NYTPhotoViewer/NYTPhotosViewController.h @@ -56,8 +56,12 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; /** * The data source underlying this PhotosViewController. + * + * After setting a new data source, you must call `-reloadPhotosAnimated:`. + * + * The data source is retained (unlike UITableView's data source). */ -@property (nonatomic, readonly) id dataSource; +@property (nonatomic) id dataSource; /** * The object conforming to `NYTPhoto` that is currently being displayed by the `pageViewController`. From 4750578eec1cfe3e3b5d9584d400f4795fc27e9b Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 27 Jan 2017 12:02:15 -0500 Subject: [PATCH 21/55] Add reload-all-photos method to `NYTPhotosVC` --- NYTPhotoViewer/NYTPhotosViewController.h | 7 +++++++ NYTPhotoViewer/NYTPhotosViewController.m | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/NYTPhotoViewer/NYTPhotosViewController.h b/NYTPhotoViewer/NYTPhotosViewController.h index 083a9ff3..25f73879 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.h +++ b/NYTPhotoViewer/NYTPhotosViewController.h @@ -154,6 +154,13 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; */ - (void)updatePhoto:(id)photo; +/** + * Tells the photo viewer to reload all data from its data source. + * + * @param animated Whether any resulting transitions should be animated. + */ +- (void)reloadPhotosAnimated:(BOOL)animated; + @end /** diff --git a/NYTPhotoViewer/NYTPhotosViewController.m b/NYTPhotoViewer/NYTPhotosViewController.m index 37dc7b63..8405bb5f 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.m +++ b/NYTPhotoViewer/NYTPhotosViewController.m @@ -354,6 +354,22 @@ - (void)updatePhoto:(id)photo { } } +- (void)reloadPhotosAnimated:(BOOL)animated { + id newCurrentPhoto; + + if ([self.dataSource indexOfPhoto:self.currentlyDisplayedPhoto] != NSNotFound) { + newCurrentPhoto = self.currentlyDisplayedPhoto; + } else { + newCurrentPhoto = [self.dataSource photoAtIndex:0]; + } + + [self displayPhoto:newCurrentPhoto animated:animated]; + + if (self.overlayView.hidden) { + [self setOverlayViewHidden:NO animated:animated]; + } +} + #pragma mark - Gesture Recognizers - (void)didSingleTapWithGestureRecognizer:(UITapGestureRecognizer *)tapGestureRecognizer { From d3d2323e1cc6fe841701e844d9c4a7f6cf89fa47 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 27 Jan 2017 12:02:56 -0500 Subject: [PATCH 22/55] Add an Example codepath which demos replacing the data source --- Example/NYTViewController.m | 164 ++++++++++++++++++++++++------------ 1 file changed, 111 insertions(+), 53 deletions(-) diff --git a/Example/NYTViewController.m b/Example/NYTViewController.m index 98236c99..eae2b9b1 100644 --- a/Example/NYTViewController.m +++ b/Example/NYTViewController.m @@ -31,81 +31,46 @@ @interface NYTViewController () @implementation NYTViewController - (IBAction)imageButtonTapped:(id)sender { - self.dataSource = [NYTPhotoViewerArrayDataSource dataSourceWithPhotos:[self.class newTestPhotos]]; + self.dataSource = [self.class newTimesBuildingDataSource]; NYTPhotosViewController *photosViewController = [[NYTPhotosViewController alloc] initWithDataSource:self.dataSource initialPhoto:nil delegate:self]; [self presentViewController:photosViewController animated:YES completion:nil]; [self updateImagesOnPhotosViewController:photosViewController afterDelayWithDataSource:self.dataSource]; +// [self switchDataSourceOnPhotosViewController:photosViewController afterDelayWithDataSource:self.dataSource]; } // This method simulates previously blank photos loading their images after some time. - (void)updateImagesOnPhotosViewController:(NYTPhotosViewController *)photosViewController afterDelayWithDataSource:(NYTPhotoViewerArrayDataSource *)dataSource { + if (dataSource!= self.dataSource) { + return; + } + CGFloat updateImageDelay = 5.0; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(updateImageDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ for (NYTExamplePhoto *photo in dataSource.photos) { if (!photo.image && !photo.imageData) { photo.image = [UIImage imageNamed:@"NYTimesBuilding"]; - photo.attributedCaptionSummary = [[NSAttributedString alloc] initWithString:@"photo which previously had a loading spinner (reopen the photo viewer and scroll to here to see it)" attributes:@{NSForegroundColorAttributeName: [UIColor whiteColor], NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleBody]}]; + photo.attributedCaptionSummary = [[NSAttributedString alloc] initWithString:@"Photo which previously had a loading spinner (reopen the photo viewer and scroll to here to see it)" attributes:@{NSForegroundColorAttributeName: [UIColor whiteColor], NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleBody]}]; [photosViewController updatePhoto:photo]; } } }); } -+ (NSArray *)newTestPhotos { - NSMutableArray *photos = [NSMutableArray array]; - - for (NSUInteger i = 0; i < NYTViewControllerPhotoCount; i++) { - NYTExamplePhoto *photo = [[NYTExamplePhoto alloc] init]; - - if (i == NYTViewControllerPhotoIndexGif) { - photo.imageData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"giphy" ofType:@"gif"]]; - } else if (i == NYTViewControllerPhotoIndexCustomEverything || i == NYTViewControllerPhotoIndexDefaultLoadingSpinner) { - // no-op, left here for clarity: - photo.image = nil; - } else { - photo.image = [UIImage imageNamed:@"NYTimesBuilding"]; - } - - if (i == NYTViewControllerPhotoIndexCustomEverything) { - photo.placeholderImage = [UIImage imageNamed:@"NYTimesBuildingPlaceholder"]; - } - - NSString *caption = @"summary"; - switch ((NYTViewControllerPhotoIndex)i) { - case NYTViewControllerPhotoIndexCustomEverything: - caption = @"photo with custom everything"; - break; - case NYTViewControllerPhotoIndexLongCaption: - caption = @"photo with long caption. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum maximus laoreet vehicula. Maecenas elit quam, pellentesque at tempor vel, tempus non sem. Vestibulum ut aliquam elit. Vivamus rhoncus sapien turpis, at feugiat augue luctus id. Nulla mi urna, viverra sed augue malesuada, bibendum bibendum massa. Cras urna nibh, lacinia vitae feugiat eu, consectetur a tellus. Morbi venenatis nunc sit amet varius pretium. Duis eget sem nec nulla lobortis finibus. Nullam pulvinar gravida est eget tristique. Curabitur faucibus nisl eu diam ullamcorper, at pharetra eros dictum. Suspendisse nibh urna, ultrices a augue a, euismod mattis felis. Ut varius tortor ac efficitur pellentesque. Mauris sit amet rhoncus dolor. Proin vel porttitor mi. Pellentesque lobortis interdum turpis, vitae tincidunt purus vestibulum vel. Phasellus tincidunt vel mi sit amet congue."; - break; - case NYTViewControllerPhotoIndexDefaultLoadingSpinner: - caption = @"photo with loading spinner"; - break; - case NYTViewControllerPhotoIndexNoReferenceView: - caption = @"photo without reference view"; - break; - case NYTViewControllerPhotoIndexCustomMaxZoomScale: - caption = @"photo with custom maximum zoom scale"; - break; - case NYTViewControllerPhotoIndexGif: - caption = @"animated GIF"; - break; - case NYTViewControllerPhotoCount: - // this case statement intentionally left blank. - break; - } - - photo.attributedCaptionTitle = [[NSAttributedString alloc] initWithString:@(i + 1).stringValue attributes:@{NSForegroundColorAttributeName: [UIColor whiteColor], NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleBody]}]; - photo.attributedCaptionSummary = [[NSAttributedString alloc] initWithString:caption attributes:@{NSForegroundColorAttributeName: [UIColor lightGrayColor], NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleBody]}]; - photo.attributedCaptionCredit = [[NSAttributedString alloc] initWithString:@"NYT Building Photo Credit: Nic Lehoux" attributes:@{NSForegroundColorAttributeName: [UIColor grayColor], NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]}]; - - [photos addObject:photo]; +- (void)switchDataSourceOnPhotosViewController:(NYTPhotosViewController *)photosViewController afterDelayWithDataSource:(NYTPhotoViewerArrayDataSource *)dataSource { + if (dataSource!= self.dataSource) { + return; } - - return photos; + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + NYTExamplePhoto *photoWithLongCaption = (NYTExamplePhoto *)dataSource[NYTViewControllerPhotoIndexLongCaption]; + photosViewController.delegate = nil; // delegate methods in this VC are intended for use with the TimesBuildingDataSource + self.dataSource = [self.class newVariedDataSourceIncludingPhoto:photoWithLongCaption]; + photosViewController.dataSource = self.dataSource; + [photosViewController reloadPhotosAnimated:YES]; + }); } #pragma mark - NYTPhotosViewControllerDelegate @@ -177,4 +142,97 @@ - (void)photosViewControllerDidDismiss:(NYTPhotosViewController *)photosViewCont NSLog(@"Did Dismiss Photo Viewer: %@", photosViewController); } +#pragma mark - Sample Data Sources + ++ (NYTPhotoViewerArrayDataSource *)newTimesBuildingDataSource { + NSMutableArray *photos = [NSMutableArray array]; + + for (NSUInteger i = 0; i < NYTViewControllerPhotoCount; i++) { + NYTExamplePhoto *photo = [NYTExamplePhoto new]; + + if (i == NYTViewControllerPhotoIndexGif) { + photo.imageData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"giphy" ofType:@"gif"]]; + } else if (i == NYTViewControllerPhotoIndexCustomEverything || i == NYTViewControllerPhotoIndexDefaultLoadingSpinner) { + // no-op, left here for clarity: + photo.image = nil; + } else { + photo.image = [UIImage imageNamed:@"NYTimesBuilding"]; + } + + if (i == NYTViewControllerPhotoIndexCustomEverything) { + photo.placeholderImage = [UIImage imageNamed:@"NYTimesBuildingPlaceholder"]; + } + + NSString *caption = @""; + switch ((NYTViewControllerPhotoIndex)i) { + case NYTViewControllerPhotoIndexCustomEverything: + caption = @"Photo with custom everything"; + break; + case NYTViewControllerPhotoIndexLongCaption: + caption = @"Photo with long caption.\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum maximus laoreet vehicula. Maecenas elit quam, pellentesque at tempor vel, tempus non sem. Vestibulum ut aliquam elit. Vivamus rhoncus sapien turpis, at feugiat augue luctus id. Nulla mi urna, viverra sed augue malesuada, bibendum bibendum massa. Cras urna nibh, lacinia vitae feugiat eu, consectetur a tellus. Morbi venenatis nunc sit amet varius pretium. Duis eget sem nec nulla lobortis finibus. Nullam pulvinar gravida est eget tristique. Curabitur faucibus nisl eu diam ullamcorper, at pharetra eros dictum. Suspendisse nibh urna, ultrices a augue a, euismod mattis felis. Ut varius tortor ac efficitur pellentesque. Mauris sit amet rhoncus dolor. Proin vel porttitor mi. Pellentesque lobortis interdum turpis, vitae tincidunt purus vestibulum vel. Phasellus tincidunt vel mi sit amet congue."; + break; + case NYTViewControllerPhotoIndexDefaultLoadingSpinner: + caption = @"Photo with loading spinner"; + break; + case NYTViewControllerPhotoIndexNoReferenceView: + caption = @"Photo without reference view"; + break; + case NYTViewControllerPhotoIndexCustomMaxZoomScale: + caption = @"Photo with custom maximum zoom scale"; + break; + case NYTViewControllerPhotoIndexGif: + caption = @"Animated GIF"; + break; + case NYTViewControllerPhotoCount: + // this case statement intentionally left blank. + break; + } + + photo.attributedCaptionTitle = [self attributedTitleFromString:@(i + 1).stringValue]; + photo.attributedCaptionSummary = [self attributedSummaryFromString:caption]; + + if (i != NYTViewControllerPhotoIndexGif) { + photo.attributedCaptionCredit = [self attributedCreditFromString:@"Photo: Nic Lehoux"]; + } + + [photos addObject:photo]; + } + + return [NYTPhotoViewerArrayDataSource dataSourceWithPhotos:photos]; +} + +/// A second set of test photos, to demonstrate reloading the entire data source. ++ (NYTPhotoViewerArrayDataSource *)newVariedDataSourceIncludingPhoto:(NYTExamplePhoto *)photo { + NSMutableArray *photos = [NSMutableArray array]; + + [photos addObject:({ + NYTExamplePhoto *p = [NYTExamplePhoto new]; + p.image = [UIImage imageNamed:@"Chess"]; + p.attributedCaptionTitle = [self attributedTitleFromString:@"Chess"]; + p.attributedCaptionCredit = [self attributedCreditFromString:@"Photo: Chris Dzombak"]; + p; + })]; + + [photos addObject:({ + NYTExamplePhoto *p = photo; + photo.attributedCaptionTitle = nil; + p.attributedCaptionSummary = [self attributedSummaryFromString:@"This photo’s caption has changed in the data source."]; + p; + })]; + + return [NYTPhotoViewerArrayDataSource dataSourceWithPhotos:photos]; +} + ++ (NSAttributedString *)attributedTitleFromString:(NSString *)caption { + return [[NSAttributedString alloc] initWithString:caption attributes:@{NSForegroundColorAttributeName: [UIColor whiteColor], NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleBody]}]; +} + ++ (NSAttributedString *)attributedSummaryFromString:(NSString *)summary { + return [[NSAttributedString alloc] initWithString:summary attributes:@{NSForegroundColorAttributeName: [UIColor lightGrayColor], NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleBody]}]; +} + ++ (NSAttributedString *)attributedCreditFromString:(NSString *)credit { + return [[NSAttributedString alloc] initWithString:credit attributes:@{NSForegroundColorAttributeName: [UIColor grayColor], NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]}]; +} + @end From 290ba8cdb2e3c2a2d293340d84dd5015c357f817 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 27 Jan 2017 12:03:10 -0500 Subject: [PATCH 23/55] Improve `NYTPhotosVC` animation logic --- NYTPhotoViewer/NYTPhotosViewController.m | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/NYTPhotoViewer/NYTPhotosViewController.m b/NYTPhotoViewer/NYTPhotosViewController.m index 8405bb5f..ebe32a56 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.m +++ b/NYTPhotoViewer/NYTPhotosViewController.m @@ -443,8 +443,16 @@ - (void)setCurrentlyDisplayedViewController:(UIViewController Date: Fri, 27 Jan 2017 12:17:43 -0500 Subject: [PATCH 24/55] Add a single-photo data source class This makes using the photo viewer with a single photo _almost_ as simple as it was before. --- NYTPhotoViewer.xcodeproj/project.pbxproj | 16 +++++++- .../NYTPhotoViewerSinglePhotoDataSource.h | 40 +++++++++++++++++++ .../NYTPhotoViewerSinglePhotoDataSource.m | 38 ++++++++++++++++++ 3 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.h create mode 100644 NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.m diff --git a/NYTPhotoViewer.xcodeproj/project.pbxproj b/NYTPhotoViewer.xcodeproj/project.pbxproj index 50bcff3a..8095404c 100644 --- a/NYTPhotoViewer.xcodeproj/project.pbxproj +++ b/NYTPhotoViewer.xcodeproj/project.pbxproj @@ -95,6 +95,10 @@ 11FBDAFD1C877D9A00018169 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 11FBDAFB1C877D9A00018169 /* LaunchScreen.xib */; }; 11FBDAFE1C877F5500018169 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 111084781C876A2B00699670 /* Assets.xcassets */; }; 11FBDAFF1C877F8000018169 /* giphy.gif in Resources */ = {isa = PBXBuildFile; fileRef = 111084851C876B0400699670 /* giphy.gif */; }; + 93F45B181E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 93F45B161E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 93F45B191E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 93F45B161E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 93F45B1A1E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 93F45B171E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.m */; }; + 93F45B1B1E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 93F45B171E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -288,6 +292,8 @@ 11FBDAEE1C877C5D00018169 /* ExamplePhoto.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExamplePhoto.swift; sourceTree = ""; }; 11FBDAF01C877C8B00018169 /* PhotosProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotosProvider.swift; sourceTree = ""; }; 11FBDAFC1C877D9A00018169 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 93F45B161E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoViewerSinglePhotoDataSource.h; sourceTree = ""; }; + 93F45B171E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoViewerSinglePhotoDataSource.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -369,8 +375,6 @@ 111084341C87682300699670 /* NYTPhotoCaptionView.m */, 111084351C87682300699670 /* NYTPhotoDismissalInteractionController.h */, 111084361C87682300699670 /* NYTPhotoDismissalInteractionController.m */, - 111084371C87682300699670 /* NYTPhotoViewerArrayDataSource.h */, - 111084381C87682300699670 /* NYTPhotoViewerArrayDataSource.m */, 111084391C87682300699670 /* NYTPhotosOverlayView.h */, 1110843A1C87682300699670 /* NYTPhotosOverlayView.m */, 1110843B1C87682300699670 /* NYTPhotosViewController.h */, @@ -381,6 +385,10 @@ 111084401C87682300699670 /* NYTPhotoTransitionController.m */, 111084411C87682300699670 /* NYTPhotoViewController.h */, 111084421C87682300699670 /* NYTPhotoViewController.m */, + 111084371C87682300699670 /* NYTPhotoViewerArrayDataSource.h */, + 111084381C87682300699670 /* NYTPhotoViewerArrayDataSource.m */, + 93F45B161E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.h */, + 93F45B171E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.m */, 111084431C87682300699670 /* NYTScalingImageView.h */, 111084441C87682300699670 /* NYTScalingImageView.m */, 111084451C87682300699670 /* Protocols */, @@ -513,6 +521,7 @@ 1110845C1C87682300699670 /* NYTScalingImageView.h in Headers */, 111084521C87682300699670 /* NYTPhotosOverlayView.h in Headers */, 111084561C87682300699670 /* NYTPhotoTransitionAnimator.h in Headers */, + 93F45B181E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.h in Headers */, 111084581C87682300699670 /* NYTPhotoTransitionController.h in Headers */, 1110845F1C87682300699670 /* NYTPhotoCaptionViewLayoutWidthHinting.h in Headers */, 1110845E1C87682300699670 /* NYTPhoto.h in Headers */, @@ -535,6 +544,7 @@ 11FBDA901C87753200018169 /* NYTPhotoViewerArrayDataSource.h in Headers */, 11FBDA9F1C87753200018169 /* NYTPhotoCaptionViewLayoutWidthHinting.h in Headers */, 11FBDA941C87753200018169 /* NYTPhotosViewController.h in Headers */, + 93F45B191E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.h in Headers */, 11FBDAA61C87768B00018169 /* NYTPhotoViewerCore.h in Headers */, 11FBDA9E1C87753200018169 /* NYTPhoto.h in Headers */, 11FBDAA21C87753200018169 /* NSBundle+NYTPhotoViewer.h in Headers */, @@ -811,6 +821,7 @@ 111084591C87682300699670 /* NYTPhotoTransitionController.m in Sources */, 111084631C87682300699670 /* NSBundle+NYTPhotoViewer.m in Sources */, 111084551C87682300699670 /* NYTPhotosViewController.m in Sources */, + 93F45B1A1E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.m in Sources */, 1110844D1C87682300699670 /* NYTPhotoCaptionView.m in Sources */, 1110845D1C87682300699670 /* NYTScalingImageView.m in Sources */, 111084511C87682300699670 /* NYTPhotoViewerArrayDataSource.m in Sources */, @@ -854,6 +865,7 @@ 11FBDA991C87753200018169 /* NYTPhotoTransitionController.m in Sources */, 11FBDAA31C87753200018169 /* NSBundle+NYTPhotoViewer.m in Sources */, 11FBDA951C87753200018169 /* NYTPhotosViewController.m in Sources */, + 93F45B1B1E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.m in Sources */, 11FBDA8D1C87753200018169 /* NYTPhotoCaptionView.m in Sources */, 11FBDA9D1C87753200018169 /* NYTScalingImageView.m in Sources */, 11FBDA911C87753200018169 /* NYTPhotoViewerArrayDataSource.m in Sources */, diff --git a/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.h b/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.h new file mode 100644 index 00000000..65edcc56 --- /dev/null +++ b/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.h @@ -0,0 +1,40 @@ +// +// NYTPhotoViewerSinglePhotoDataSource.h +// NYTPhotoViewer +// +// Created by Chris Dzombak on 1/27/17. +// Copyright © 2017 The New York Times Company. All rights reserved. +// + +@import Foundation; + +#import "NYTPhotoViewerDataSource.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * A simple concrete implementation of `NYTPhotoViewerDataSource`, for use with a single image. + */ +@interface NYTPhotoViewerSinglePhotoDataSource : NSObject + +@property (nonatomic, readonly) id photo; + +/** + * The designated initializer that takes and stores a single photo. + * + * @param photos An object conforming to the `NYTPhoto` protocol. + * + * @return A fully initialized data source. + */ +- (instancetype)initWithPhoto:(id)photo NS_DESIGNATED_INITIALIZER; + ++ (instancetype)dataSourceWithPhoto:(id)photo; + +/** + * Initializing without a photo is invalid. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.m b/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.m new file mode 100644 index 00000000..3ec9104e --- /dev/null +++ b/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.m @@ -0,0 +1,38 @@ +// +// NYTPhotoViewerSinglePhotoDataSource.m +// NYTPhotoViewer +// +// Created by Chris Dzombak on 1/27/17. +// Copyright © 2017 The New York Times Company. All rights reserved. +// + +#import "NYTPhotoViewerSinglePhotoDataSource.h" + +@implementation NYTPhotoViewerSinglePhotoDataSource + +- (instancetype)initWithPhoto:(id)photo { + if ((self = [super init])) { + _photo = photo; + } + return self; +} + ++ (instancetype)dataSourceWithPhoto:(id)photo { + return [[self alloc] initWithPhoto:photo]; +} + +#pragma mark NYTPhotoViewerDataSource + +- (NSNumber *)numberOfPhotos { + return @(1); +} + +- (id)photoAtIndex:(NSInteger)photoIndex { + return self.photo; +} + +- (NSInteger)indexOfPhoto:(id)photo { + return 0; +} + +@end From 3dcdbf04b1ebcc2cb61efb9a9009f822f3d9a058 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 27 Jan 2017 12:17:56 -0500 Subject: [PATCH 25/55] docs: tweak ArrayDataSource initializer documentation --- NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h index d59b33fb..41a105cb 100644 --- a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h +++ b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h @@ -24,7 +24,7 @@ NS_ASSUME_NONNULL_BEGIN * * @param photos An array of objects conforming to the `NYTPhoto` protocol. * - * @return A fully initialized object. + * @return A fully initialized data source. */ - (instancetype)initWithPhotos:(nullable NSArray> *)photos NS_DESIGNATED_INITIALIZER; From f8ccb16887e0f540543642d05b92ceef7aa9d26e Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 27 Jan 2017 12:35:30 -0500 Subject: [PATCH 26/55] Modernize PhotosVC code style --- NYTPhotoViewer/NYTPhotosViewController.m | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/NYTPhotoViewer/NYTPhotosViewController.m b/NYTPhotoViewer/NYTPhotosViewController.m index ebe32a56..50838365 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.m +++ b/NYTPhotoViewer/NYTPhotosViewController.m @@ -183,12 +183,15 @@ - (void)commonInitWithDataSource:(id )dataSource initi self.transitioningDelegate = _transitionController; self.modalPresentationCapturesStatusBarAppearance = YES; - _overlayView = [[NYTPhotosOverlayView alloc] initWithFrame:CGRectZero]; - _overlayView.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"NYTPhotoViewerCloseButtonX" inBundle:[NSBundle nyt_photoViewerResourceBundle] compatibleWithTraitCollection:nil] landscapeImagePhone:[UIImage imageNamed:@"NYTPhotoViewerCloseButtonXLandscape" inBundle:[NSBundle nyt_photoViewerResourceBundle] compatibleWithTraitCollection:nil] style:UIBarButtonItemStylePlain target:self action:@selector(doneButtonTapped:)]; - _overlayView.leftBarButtonItem.imageInsets = NYTPhotosViewControllerCloseButtonImageInsets; - _overlayView.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(actionButtonTapped:)]; - - _notificationCenter = [[NSNotificationCenter alloc] init]; + _overlayView = ({ + NYTPhotosOverlayView *v = [[NYTPhotosOverlayView alloc] initWithFrame:CGRectZero]; + v.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"NYTPhotoViewerCloseButtonX" inBundle:[NSBundle nyt_photoViewerResourceBundle] compatibleWithTraitCollection:nil] landscapeImagePhone:[UIImage imageNamed:@"NYTPhotoViewerCloseButtonXLandscape" inBundle:[NSBundle nyt_photoViewerResourceBundle] compatibleWithTraitCollection:nil] style:UIBarButtonItemStylePlain target:self action:@selector(doneButtonTapped:)]; + v.leftBarButtonItem.imageInsets = NYTPhotosViewControllerCloseButtonImageInsets; + v.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(actionButtonTapped:)]; + v; + }); + + _notificationCenter = [NSNotificationCenter new]; [self setupPageViewControllerWithInitialPhoto:initialPhoto]; } From 62d54bea5631a5b6c0506802d545928e7d5ef8ba Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 27 Jan 2017 12:51:00 -0500 Subject: [PATCH 27/55] =?UTF-8?q?Make=20Xcode=20(8.2)=20recommended=20upda?= =?UTF-8?q?tes=20to=20NYTPhotoViewer=E2=80=99s=20Xcode=20project?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NYTPhotoViewer.xcodeproj/project.pbxproj | 11 ++++++++++- .../xcshareddata/xcschemes/NYTPhotoViewer.xcscheme | 2 +- .../xcschemes/NYTPhotoViewerCore.xcscheme | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/NYTPhotoViewer.xcodeproj/project.pbxproj b/NYTPhotoViewer.xcodeproj/project.pbxproj index 8095404c..9d653744 100644 --- a/NYTPhotoViewer.xcodeproj/project.pbxproj +++ b/NYTPhotoViewer.xcodeproj/project.pbxproj @@ -660,7 +660,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0720; + LastUpgradeCheck = 0820; ORGANIZATIONNAME = NYTimes; TargetAttributes = { 111084051C875B5000699670 = { @@ -976,8 +976,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -1023,8 +1025,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -1044,6 +1048,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 9.2; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1054,6 +1059,7 @@ 1110841B1C875B5000699670 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1076,6 +1082,7 @@ 1110841C1C875B5000699670 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1136,6 +1143,7 @@ 11FBDA891C8774AD00018169 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1153,6 +1161,7 @@ 11FBDA8A1C8774AD00018169 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; diff --git a/NYTPhotoViewer.xcodeproj/xcshareddata/xcschemes/NYTPhotoViewer.xcscheme b/NYTPhotoViewer.xcodeproj/xcshareddata/xcschemes/NYTPhotoViewer.xcscheme index 7a1ba328..f5b83ab8 100644 --- a/NYTPhotoViewer.xcodeproj/xcshareddata/xcschemes/NYTPhotoViewer.xcscheme +++ b/NYTPhotoViewer.xcodeproj/xcshareddata/xcschemes/NYTPhotoViewer.xcscheme @@ -1,6 +1,6 @@ Date: Fri, 27 Jan 2017 13:13:54 -0500 Subject: [PATCH 28/55] =?UTF-8?q?Avoid=20using=20`NYTPhotosVC`=E2=80=99s?= =?UTF-8?q?=20delegate=20until=20after=20`-init=E2=80=A6`=20returns?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This eliminates the bug where some delegate methods weren’t called for the first photo --- NYTPhotoViewer/NYTPhotosViewController.h | 2 -- NYTPhotoViewer/NYTPhotosViewController.m | 23 +++++++++++++---------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/NYTPhotoViewer/NYTPhotosViewController.h b/NYTPhotoViewer/NYTPhotosViewController.h index 25f73879..652cdf2b 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.h +++ b/NYTPhotoViewer/NYTPhotosViewController.h @@ -97,8 +97,6 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; /** * The object that acts as the delegate of the `NYTPhotosViewController`. - * - * @warning It is recommended that you pass a delegate to the designated initializer of this class; otherwise certain delegate methods may not be called for the initial photo displayed by this view controller. */ @property (nonatomic, weak, nullable) id delegate; diff --git a/NYTPhotoViewer/NYTPhotosViewController.m b/NYTPhotoViewer/NYTPhotosViewController.m index 50838365..cae41f86 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.m +++ b/NYTPhotoViewer/NYTPhotosViewController.m @@ -52,6 +52,8 @@ - (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER; @property (nonatomic, readonly) UIView *referenceViewForCurrentPhoto; @property (nonatomic, readonly) CGPoint boundsCenterPoint; +@property (nonatomic, nullable) id initialPhoto; + @end @implementation NYTPhotosViewController @@ -102,6 +104,8 @@ - (instancetype)initWithCoder:(NSCoder *)aDecoder { - (void)viewDidLoad { [super viewDidLoad]; + [self configurePageViewControllerWithInitialPhoto]; + self.view.tintColor = [UIColor whiteColor]; self.view.backgroundColor = [UIColor blackColor]; self.pageViewController.view.backgroundColor = [UIColor clearColor]; @@ -174,6 +178,7 @@ - (instancetype)initWithDataSource:(id )dataSource ini - (void)commonInitWithDataSource:(id )dataSource initialPhoto:(id _Nullable)initialPhoto delegate:(nullable id )delegate { _dataSource = dataSource; _delegate = delegate; + _initialPhoto = initialPhoto; _panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(didPanWithGestureRecognizer:)]; _singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didSingleTapWithGestureRecognizer:)]; @@ -193,24 +198,22 @@ - (void)commonInitWithDataSource:(id )dataSource initi _notificationCenter = [NSNotificationCenter new]; - [self setupPageViewControllerWithInitialPhoto:initialPhoto]; -} - -- (void)setupPageViewControllerWithInitialPhoto:(id )initialPhoto { self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:@{UIPageViewControllerOptionInterPageSpacingKey: @(NYTPhotosViewControllerInterPhotoSpacing)}]; - + self.pageViewController.delegate = self; self.pageViewController.dataSource = self; - +} + +- (void)configurePageViewControllerWithInitialPhoto { NYTPhotoViewController *initialPhotoViewController; - - if ([self.dataSource indexOfPhoto:initialPhoto] != NSNotFound) { - initialPhotoViewController = [self newPhotoViewControllerForPhoto:initialPhoto]; + + if (self.initialPhoto != nil && [self.dataSource indexOfPhoto:self.initialPhoto] != NSNotFound) { + initialPhotoViewController = [self newPhotoViewControllerForPhoto:self.initialPhoto]; } else { initialPhotoViewController = [self newPhotoViewControllerForPhoto:[self.dataSource photoAtIndex:0]]; } - + [self setCurrentlyDisplayedViewController:initialPhotoViewController animated:NO]; } From bb38825cef7d6fc9857e8b49c3f8bf107dbbd80d Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 27 Jan 2017 13:14:26 -0500 Subject: [PATCH 29/55] Add convenience `NYTPhotosVC` initializer accepting solely a data source --- NYTPhotoViewer/NYTPhotosViewController.h | 13 +++++++++++-- NYTPhotoViewer/NYTPhotosViewController.m | 4 ++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/NYTPhotoViewer/NYTPhotosViewController.h b/NYTPhotoViewer/NYTPhotosViewController.h index 652cdf2b..3125fbf7 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.h +++ b/NYTPhotoViewer/NYTPhotosViewController.h @@ -100,6 +100,15 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; */ @property (nonatomic, weak, nullable) id delegate; +/** + * Initializes a `PhotosViewController` with the given data source, initially displaying the first photo in the data source. + * + * @param dataSource The data source underlying this photo viewer. + * + * @return A fully initialized `PhotosViewController` instance. + */ +- (instancetype)initWithDataSource:(id )dataSource; + /** * Initializes a `PhotosViewController` with the given data source and delegate, initially displaying the photo at the given index in the data source. * @@ -107,7 +116,7 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; * @param initialPhotoIndex The photo to display initially. If outside the bounds of the data source, the first photo from the data source will be displayed. * @param delegate The delegate for this `NYTPhotosViewController`. * - * @return A fully initialized object. + * @return A fully initialized `PhotosViewController` instance. */ - (instancetype)initWithDataSource:(id )dataSource initialPhotoIndex:(NSInteger)initialPhotoIndex delegate:(nullable id )delegate; @@ -118,7 +127,7 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; * @param initialPhoto The photo to display initially. Must be a member of the data source. If `nil` or not a member of the data source, the first photo from the data source will be displayed. * @param delegate The delegate for this `NYTPhotosViewController`. * - * @return A fully initialized object. + * @return A fully initialized `PhotosViewController` instance. */ - (instancetype)initWithDataSource:(id )dataSource initialPhoto:(id _Nullable)initialPhoto delegate:(nullable id )delegate NS_DESIGNATED_INITIALIZER; diff --git a/NYTPhotoViewer/NYTPhotosViewController.m b/NYTPhotoViewer/NYTPhotosViewController.m index cae41f86..8b71f5f9 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.m +++ b/NYTPhotoViewer/NYTPhotosViewController.m @@ -158,6 +158,10 @@ - (void)dismissViewControllerAnimated:(BOOL)animated completion:(void (^)(void)) #pragma mark - NYTPhotosViewController +- (instancetype)initWithDataSource:(id )dataSource { + return [self initWithDataSource:dataSource initialPhoto:nil delegate:nil]; +} + - (instancetype)initWithDataSource:(id )dataSource initialPhotoIndex:(NSInteger)initialPhotoIndex delegate:(nullable id )delegate { id initialPhoto = [dataSource photoAtIndex:initialPhotoIndex]; From 2f45ab96b28007ddeb04a7e57148f5ae20c58d9c Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 27 Jan 2017 13:15:05 -0500 Subject: [PATCH 30/55] Fix incorrect `NYTPhotosVC` convenience initializer --- NYTPhotoViewer/NYTPhotosViewController.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/NYTPhotoViewer/NYTPhotosViewController.m b/NYTPhotoViewer/NYTPhotosViewController.m index 8b71f5f9..8e1a9aa2 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.m +++ b/NYTPhotoViewer/NYTPhotosViewController.m @@ -165,8 +165,7 @@ - (instancetype)initWithDataSource:(id )dataSource { - (instancetype)initWithDataSource:(id )dataSource initialPhotoIndex:(NSInteger)initialPhotoIndex delegate:(nullable id )delegate { id initialPhoto = [dataSource photoAtIndex:initialPhotoIndex]; - self = [self initWithDataSource:dataSource initialPhoto:initialPhoto delegate:delegate]; - return self; + return [self initWithDataSource:dataSource initialPhoto:initialPhoto delegate:delegate]; } - (instancetype)initWithDataSource:(id )dataSource initialPhoto:(id _Nullable)initialPhoto delegate:(nullable id )delegate { From b5e3c072fb0e4155f51a629c10c867bdfa3d618e Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 27 Jan 2017 14:52:22 -0500 Subject: [PATCH 31/55] style: correct spacing in Example ViewController --- Example/NYTViewController.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Example/NYTViewController.m b/Example/NYTViewController.m index eae2b9b1..425ad043 100644 --- a/Example/NYTViewController.m +++ b/Example/NYTViewController.m @@ -43,7 +43,7 @@ - (IBAction)imageButtonTapped:(id)sender { // This method simulates previously blank photos loading their images after some time. - (void)updateImagesOnPhotosViewController:(NYTPhotosViewController *)photosViewController afterDelayWithDataSource:(NYTPhotoViewerArrayDataSource *)dataSource { - if (dataSource!= self.dataSource) { + if (dataSource != self.dataSource) { return; } @@ -60,7 +60,7 @@ - (void)updateImagesOnPhotosViewController:(NYTPhotosViewController *)photosView } - (void)switchDataSourceOnPhotosViewController:(NYTPhotosViewController *)photosViewController afterDelayWithDataSource:(NYTPhotoViewerArrayDataSource *)dataSource { - if (dataSource!= self.dataSource) { + if (dataSource != self.dataSource) { return; } From f71d8f4847c32ff4048051a4f72cac8426175a95 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 27 Jan 2017 14:55:44 -0500 Subject: [PATCH 32/55] fix: use proper equality checks --- NYTPhotoViewer/NYTPhotosViewController.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NYTPhotoViewer/NYTPhotosViewController.m b/NYTPhotoViewer/NYTPhotosViewController.m index 8e1a9aa2..d1a99a2f 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.m +++ b/NYTPhotoViewer/NYTPhotosViewController.m @@ -358,7 +358,7 @@ - (void)updatePhoto:(id)photo { [self.notificationCenter postNotificationName:NYTPhotoViewControllerPhotoImageUpdatedNotification object:photo]; - if (self.currentlyDisplayedPhoto == photo) { + if ([self.currentlyDisplayedPhoto isEqual:photo]) { [self updateOverlayInformation]; } } @@ -453,7 +453,7 @@ - (void)setCurrentlyDisplayedViewController:(UIViewController Date: Fri, 27 Jan 2017 14:55:55 -0500 Subject: [PATCH 33/55] docs: clarify how NYTPhoto equality is determined --- NYTPhotoViewer/Protocols/NYTPhoto.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NYTPhotoViewer/Protocols/NYTPhoto.h b/NYTPhotoViewer/Protocols/NYTPhoto.h index c3ae31ab..83395f35 100644 --- a/NYTPhotoViewer/Protocols/NYTPhoto.h +++ b/NYTPhotoViewer/Protocols/NYTPhoto.h @@ -12,6 +12,8 @@ NS_ASSUME_NONNULL_BEGIN /** * The model for photos displayed in an `NYTPhotosViewController`. + * + * Your models (or boxes, if working with Swift value types) should override `isEqual:` to provide a concept of identity for the PhotoViewer to work with. */ @protocol NYTPhoto From cf9cfbcbbe31327faccda11bebbc91da93709a41 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 27 Jan 2017 14:56:06 -0500 Subject: [PATCH 34/55] docs: add this feature to CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b586e812..cd5c5acd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ Changes for users of the library currently on `develop`: -_This space intentionally left blank._ +- Expose a data-source-oriented API for PhotosViewController ([#226](https://github.com/NYTimes/NYTPhotoViewer/pull/226)) ## [1.2.0](https://github.com/NYTimes/NYTPhotoViewer/releases/tag/1.2.0) From a57f6d2c66b8df00b2e60d576b28d6b5b853e04b Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Mon, 30 Jan 2017 11:31:31 -0500 Subject: [PATCH 35/55] Update LICENSE to specify (c) through 2017 --- LICENSE.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index 1b8afe29..85159eb5 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,11 +1,11 @@ -Copyright (c) 2015-2016 The New York Times Company - +Copyright (c) 2015-2017 The New York Times Company + Licensed under the Apache License, Version 2.0 (the "License"); you may not use this library except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 - + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. From db4ccb526fbfe0f5e8c9847ac38ebe59aa552804 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Mon, 30 Jan 2017 11:31:49 -0500 Subject: [PATCH 36/55] docs: add missing copyright in headers --- NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h | 2 +- NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h index 41a105cb..f1a6baf2 100644 --- a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h +++ b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h @@ -3,7 +3,7 @@ // NYTPhotoViewer // // Created by Brian Capps on 2/11/15. -// +// Copyright (c) 2017 The New York Times Company. All rights reserved. // @import Foundation; diff --git a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m index 68cc209c..37d8ea53 100644 --- a/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m +++ b/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m @@ -3,7 +3,7 @@ // NYTPhotoViewer // // Created by Brian Capps on 2/11/15. -// +// Copyright (c) 2017 The New York Times Company. All rights reserved. // #import "NYTPhotoViewerArrayDataSource.h" From bbacf0cfecf67f64dd4b47d2c4d4a74b85fae916 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Tue, 31 Jan 2017 16:43:11 -0500 Subject: [PATCH 37/55] example: Use a more obvious demo for custom maximum zoom scale --- Example/NYTViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Example/NYTViewController.m b/Example/NYTViewController.m index 425ad043..9009b44e 100644 --- a/Example/NYTViewController.m +++ b/Example/NYTViewController.m @@ -108,7 +108,7 @@ - (UIView *)photosViewController:(NYTPhotosViewController *)photosViewController - (CGFloat)photosViewController:(NYTPhotosViewController *)photosViewController maximumZoomScaleForPhoto:(id )photo { if ([photo isEqual:self.dataSource.photos[NYTViewControllerPhotoIndexCustomMaxZoomScale]]) { - return 10.0f; + return 0.5f; } return 1.0f; From 7dc1e0d43e704494da99b0f9b745423a5a736972 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Tue, 31 Jan 2017 16:43:34 -0500 Subject: [PATCH 38/55] example: Improve data-source-swap demo --- Example/NYTViewController.m | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Example/NYTViewController.m b/Example/NYTViewController.m index 9009b44e..110d2468 100644 --- a/Example/NYTViewController.m +++ b/Example/NYTViewController.m @@ -36,12 +36,15 @@ - (IBAction)imageButtonTapped:(id)sender { NYTPhotosViewController *photosViewController = [[NYTPhotosViewController alloc] initWithDataSource:self.dataSource initialPhoto:nil delegate:self]; [self presentViewController:photosViewController animated:YES completion:nil]; - + [self updateImagesOnPhotosViewController:photosViewController afterDelayWithDataSource:self.dataSource]; -// [self switchDataSourceOnPhotosViewController:photosViewController afterDelayWithDataSource:self.dataSource]; + BOOL demonstrateDataSourceSwitchAfterTenSeconds = NO; + if (demonstrateDataSourceSwitchAfterTenSeconds) { + [self switchDataSourceOnPhotosViewController:photosViewController afterDelayWithDataSource:self.dataSource]; + } } -// This method simulates previously blank photos loading their images after some time. +// This method simulates a previously blank photo loading its images after 5 seconds. - (void)updateImagesOnPhotosViewController:(NYTPhotosViewController *)photosViewController afterDelayWithDataSource:(NYTPhotoViewerArrayDataSource *)dataSource { if (dataSource != self.dataSource) { return; @@ -59,12 +62,13 @@ - (void)updateImagesOnPhotosViewController:(NYTPhotosViewController *)photosView }); } +// This method simulates completely swapping out the data source, after 10 seconds. - (void)switchDataSourceOnPhotosViewController:(NYTPhotosViewController *)photosViewController afterDelayWithDataSource:(NYTPhotoViewerArrayDataSource *)dataSource { if (dataSource != self.dataSource) { return; } - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NYTExamplePhoto *photoWithLongCaption = (NYTExamplePhoto *)dataSource[NYTViewControllerPhotoIndexLongCaption]; photosViewController.delegate = nil; // delegate methods in this VC are intended for use with the TimesBuildingDataSource self.dataSource = [self.class newVariedDataSourceIncludingPhoto:photoWithLongCaption]; From d7aa268a52301c3815f60c3f834f81ba985d41aa Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Tue, 31 Jan 2017 16:43:47 -0500 Subject: [PATCH 39/55] example: Improve caption for photo with a loading spinner --- Example/NYTViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Example/NYTViewController.m b/Example/NYTViewController.m index 110d2468..6a504027 100644 --- a/Example/NYTViewController.m +++ b/Example/NYTViewController.m @@ -55,7 +55,7 @@ - (void)updateImagesOnPhotosViewController:(NYTPhotosViewController *)photosView for (NYTExamplePhoto *photo in dataSource.photos) { if (!photo.image && !photo.imageData) { photo.image = [UIImage imageNamed:@"NYTimesBuilding"]; - photo.attributedCaptionSummary = [[NSAttributedString alloc] initWithString:@"Photo which previously had a loading spinner (reopen the photo viewer and scroll to here to see it)" attributes:@{NSForegroundColorAttributeName: [UIColor whiteColor], NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleBody]}]; + photo.attributedCaptionSummary = [[NSAttributedString alloc] initWithString:@"Photo which previously had a loading spinner (to see the spinner, reopen the photo viewer and scroll to this photo)" attributes:@{NSForegroundColorAttributeName: [UIColor whiteColor], NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleBody]}]; [photosViewController updatePhoto:photo]; } } From c67c6051616a2c89561050a617c36ec6200d9ad6 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Tue, 31 Jan 2017 16:44:06 -0500 Subject: [PATCH 40/55] Use more modern `nullable` instead of `_Nullable` --- NYTPhotoViewer/NYTPhotosViewController.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NYTPhotoViewer/NYTPhotosViewController.h b/NYTPhotoViewer/NYTPhotosViewController.h index 3125fbf7..acb08a02 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.h +++ b/NYTPhotoViewer/NYTPhotosViewController.h @@ -129,7 +129,7 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; * * @return A fully initialized `PhotosViewController` instance. */ -- (instancetype)initWithDataSource:(id )dataSource initialPhoto:(id _Nullable)initialPhoto delegate:(nullable id )delegate NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithDataSource:(id )dataSource initialPhoto:(nullable id )initialPhoto delegate:(nullable id )delegate NS_DESIGNATED_INITIALIZER; /** * Displays the specified photo. Can be called before the view controller is displayed. Calling with a photo not contained within the data source has no effect. @@ -137,7 +137,7 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; * @param photo The photo to make the currently displayed photo. * @param animated Whether to animate the transition to the new photo. */ -- (void)displayPhoto:(id _Nullable)photo animated:(BOOL)animated; +- (void)displayPhoto:(nullable id )photo animated:(BOOL)animated; /** * Informs the photo viewer that the photo in the data source at this index has changed. From 2cea73f7e76c6b934337806a6240d9924bc0fa15 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Thu, 2 Feb 2017 10:42:29 -0500 Subject: [PATCH 41/55] fix: include single photo data source in umbrella header --- NYTPhotoViewer/NYTPhotoViewer.h | 1 + NYTPhotoViewer/NYTPhotoViewerCore.h | 1 + 2 files changed, 2 insertions(+) diff --git a/NYTPhotoViewer/NYTPhotoViewer.h b/NYTPhotoViewer/NYTPhotoViewer.h index 42d13d4b..c28f4983 100644 --- a/NYTPhotoViewer/NYTPhotoViewer.h +++ b/NYTPhotoViewer/NYTPhotoViewer.h @@ -18,6 +18,7 @@ FOUNDATION_EXPORT const unsigned char NYTPhotoViewerVersionString[]; #import #import #import +#import #import #import #import diff --git a/NYTPhotoViewer/NYTPhotoViewerCore.h b/NYTPhotoViewer/NYTPhotoViewerCore.h index 9579208a..55dc8a38 100644 --- a/NYTPhotoViewer/NYTPhotoViewerCore.h +++ b/NYTPhotoViewer/NYTPhotoViewerCore.h @@ -18,6 +18,7 @@ FOUNDATION_EXPORT const unsigned char NYTPhotoViewerCoreVersionString[]; #import #import #import +#import #import #import #import From ae13725c6ed92383b0e37ab86de0f99228169f74 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Thu, 2 Feb 2017 17:29:13 -0500 Subject: [PATCH 42/55] Reimplement Swift example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rather the rewriting the ObjC sample in Swift, I’ve let it demonstrate how Swift types may be boxed for use with PhotoViewer, and demonstrated how PhotoViewer may be tied into an app’s existing data layer. --- Example-Swift/AppDelegate.swift | 3 +- Example-Swift/ExamplePhoto.swift | 28 -------- Example-Swift/Photo.swift | 20 ++++++ Example-Swift/PhotoBox.swift | 50 +++++++++++++ Example-Swift/PhotoViewerCoordinator.swift | 56 +++++++++++++++ Example-Swift/PhotosProvider.swift | 64 +++++++++-------- Example-Swift/ViewController.swift | 83 +++++++--------------- NYTPhotoViewer.xcodeproj/project.pbxproj | 16 +++-- 8 files changed, 198 insertions(+), 122 deletions(-) delete mode 100755 Example-Swift/ExamplePhoto.swift create mode 100644 Example-Swift/Photo.swift create mode 100644 Example-Swift/PhotoBox.swift create mode 100644 Example-Swift/PhotoViewerCoordinator.swift diff --git a/Example-Swift/AppDelegate.swift b/Example-Swift/AppDelegate.swift index 49e51006..ee78a3f5 100755 --- a/Example-Swift/AppDelegate.swift +++ b/Example-Swift/AppDelegate.swift @@ -9,7 +9,7 @@ import UIKit @UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { +final class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? @@ -17,4 +17,3 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return true } } - diff --git a/Example-Swift/ExamplePhoto.swift b/Example-Swift/ExamplePhoto.swift deleted file mode 100755 index 929c4bdd..00000000 --- a/Example-Swift/ExamplePhoto.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// ExamplePhoto.swift -// NYTPhotoViewer -// -// Created by Mark Keefe on 3/20/15. -// Copyright (c) 2015 The New York Times. All rights reserved. -// - -import UIKit -import NYTPhotoViewer - -class ExamplePhoto: NSObject, NYTPhoto { - - var image: UIImage? - var imageData: Data? - var placeholderImage: UIImage? - let attributedCaptionTitle: NSAttributedString? - let attributedCaptionSummary: NSAttributedString? = NSAttributedString(string: "summary string", attributes: [NSForegroundColorAttributeName: UIColor.gray]) - let attributedCaptionCredit: NSAttributedString? = NSAttributedString(string: "credit", attributes: [NSForegroundColorAttributeName: UIColor.darkGray]) - - init(image: UIImage? = nil, imageData: Data? = nil, attributedCaptionTitle: NSAttributedString) { - self.image = image - self.imageData = imageData - self.attributedCaptionTitle = attributedCaptionTitle - super.init() - } - -} diff --git a/Example-Swift/Photo.swift b/Example-Swift/Photo.swift new file mode 100644 index 00000000..8be6ea59 --- /dev/null +++ b/Example-Swift/Photo.swift @@ -0,0 +1,20 @@ +// +// Photo.swift +// NYTPhotoViewer +// +// Created by Chris Dzombak on 2/2/17. +// Copyright © 2017 NYTimes. All rights reserved. +// + +import UIKit + +/// A photo may often be represented in a Swift application as a value type. +struct Photo { + // Ths would usually be a URL, but for this demo we load images from the bundle. + let name: String + + let summary: String + let credit: String + + let identifier: Int +} diff --git a/Example-Swift/PhotoBox.swift b/Example-Swift/PhotoBox.swift new file mode 100644 index 00000000..48c9d46c --- /dev/null +++ b/Example-Swift/PhotoBox.swift @@ -0,0 +1,50 @@ +// +// PhotoBox.swift +// NYTPhotoViewer +// +// Created by Chris Dzombak on 2/2/17. +// Copyright © 2017 NYTimes. All rights reserved. +// + +import UIKit +import NYTPhotoViewer + +/// A box allowing NYTPhotoViewer to consume Swift value types from our codebase. +final class NYTPhotoBox: NSObject, NYTPhoto { + + let value: Photo + + init(_ photo: Photo) { + value = photo + } + + // MARK: NYTPhoto + + var image: UIImage? + var imageData: Data? + var placeholderImage: UIImage? + + var attributedCaptionTitle: NSAttributedString? + + var attributedCaptionSummary: NSAttributedString? { + let attributes = [NSForegroundColorAttributeName: UIColor.white, + NSFontAttributeName: UIFont.preferredFont(forTextStyle: .body)] + return NSAttributedString(string: value.summary, attributes: attributes) + } + + var attributedCaptionCredit: NSAttributedString? { + let attributes = [NSForegroundColorAttributeName: UIColor.gray, + NSFontAttributeName: UIFont.preferredFont(forTextStyle: .footnote)] + return NSAttributedString(string: value.credit, attributes: attributes) + } +} + +// MARK: NSObject Equality + +extension NYTPhotoBox { + @objc + override func isEqual(_ object: Any?) -> Bool { + guard let otherPhoto = object as? NYTPhotoBox else { return false } + return value.identifier == otherPhoto.value.identifier + } +} diff --git a/Example-Swift/PhotoViewerCoordinator.swift b/Example-Swift/PhotoViewerCoordinator.swift new file mode 100644 index 00000000..478e65c1 --- /dev/null +++ b/Example-Swift/PhotoViewerCoordinator.swift @@ -0,0 +1,56 @@ +// +// PhotoViewerCoordinator.swift +// NYTPhotoViewer +// +// Created by Chris Dzombak on 2/2/17. +// Copyright © 2017 NYTimes. All rights reserved. +// + +import NYTPhotoViewer + +/// Coordinates interaction between the application's data layer and the photo viewer component. +final class PhotoViewerCoordinator: NYTPhotoViewerDataSource { + let slideshow: [NYTPhotoBox] + let provider: PhotosProvider + + lazy var photoViewer: NYTPhotosViewController = { + return NYTPhotosViewController(dataSource: self) + }() + + init(provider: PhotosProvider) { + self.provider = provider + self.slideshow = provider.fetchDemoSlideshow().map { NYTPhotoBox($0) } + self.fetchPhotos() + } + + func fetchPhotos() { + for box in slideshow { + provider.fetchPhoto(named: box.value.name, then: { [weak self] (result) in + box.image = result + self?.photoViewer.update(box) + }) + } + } + + // MARK: NYTPhotoViewerDataSource + + @objc + var numberOfPhotos: NSNumber? { + return NSNumber(integerLiteral: slideshow.count) + } + + @objc + func index(of photo: NYTPhoto) -> Int { + guard let box = photo as? NYTPhotoBox else { return NSNotFound } + return slideshow.index(where: { $0.value.identifier == box.value.identifier }) ?? NSNotFound + } + + @objc + func photo(at index: Int) -> NYTPhoto? { + guard index < slideshow.count else { return nil } + guard index >= 0 else { + fatalError() + } + return slideshow[index] + } +} diff --git a/Example-Swift/PhotosProvider.swift b/Example-Swift/PhotosProvider.swift index 8922129a..dcb5a6f4 100755 --- a/Example-Swift/PhotosProvider.swift +++ b/Example-Swift/PhotosProvider.swift @@ -7,39 +7,43 @@ // import UIKit -import NYTPhotoViewer -/** -* In Swift 1.2, the following file level constants can be moved inside the class for better encapsulation -*/ -let CustomEverythingPhotoIndex = 1, DefaultLoadingSpinnerPhotoIndex = 3, NoReferenceViewPhotoIndex = 4 -let PrimaryImageName = "NYTimesBuilding" -let PlaceholderImageName = "NYTimesBuildingPlaceholder" +/// A component of your data layer, which might load photos from the cache or network. +final class PhotosProvider { + typealias Slideshow = [Photo] -class PhotosProvider: NSObject { + /// Simulate a synchronous fetch of a slideshow, perhaps from a local database. + func fetchDemoSlideshow() -> Slideshow { + return Array(0...4).map { demoPhoto(identifier: $0) } + } - let photos: [ExamplePhoto] = { - - var mutablePhotos: [ExamplePhoto] = [] - var image = UIImage(named: PrimaryImageName) - let NumberOfPhotos = 5 - - func shouldSetImageOnIndex(_ photoIndex: Int) -> Bool { - return photoIndex != CustomEverythingPhotoIndex && photoIndex != DefaultLoadingSpinnerPhotoIndex + /// Simulate fetching a photo from the network. + /// For simplicity in this demo, errors are not simulated, and the callback is invoked on the main queue. + func fetchPhoto(named name: String, then completionHandler: @escaping (UIImage) -> Void) { + let delay = Double(arc4random_uniform(3) + 2) + DispatchQueue.main.asyncAfter(deadline: .now() + delay) { + guard let result = UIImage(named: name) else { fatalError("Image '\(name)' could not be loaded from the bundle.") } + completionHandler(result) } - - for photoIndex in 0 ..< NumberOfPhotos { - let title = NSAttributedString(string: "\(photoIndex + 1)", attributes: [NSForegroundColorAttributeName: UIColor.white]) - - let photo = shouldSetImageOnIndex(photoIndex) ? ExamplePhoto(image: image, attributedCaptionTitle: title) : ExamplePhoto(attributedCaptionTitle: title) - - if photoIndex == CustomEverythingPhotoIndex { - photo.placeholderImage = UIImage(named: PlaceholderImageName) - } - - mutablePhotos.append(photo) + } +} + +extension PhotosProvider { + fileprivate func demoPhoto(identifier: Int) -> Photo { + let photoName: String + let photoSummary: String + let photoCredit: String + + if (arc4random_uniform(2) == 0 && identifier != 0) { + photoName = "Chess" + photoSummary = "Children gather around a game of chess during the Ann Arbor Summer Festival. (Photo ID \(identifier))" + photoCredit = "Photo: Chris Dzombak" + } else { + photoName = "NYTimesBuilding" + photoSummary = "The New York Times office in Manhattan. (Photo ID \(identifier))" + photoCredit = "Photo: Nic Lehoux" } - - return mutablePhotos - }() + + return Photo(name: photoName, summary: photoSummary, credit: photoCredit, identifier: identifier) + } } diff --git a/Example-Swift/ViewController.swift b/Example-Swift/ViewController.swift index 85eef373..381fcde6 100755 --- a/Example-Swift/ViewController.swift +++ b/Example-Swift/ViewController.swift @@ -9,50 +9,43 @@ import UIKit import NYTPhotoViewer +// The Swift demo project doesn't aim to exactly replicate the ObjC demo, which comprehensively demonstrates the photo viewer. +// Rather, the Swift demo aims to show how to interact with the photo viewer in Swift, and how an application might coordinate the photo viewer with a more complex data layer. -class ViewController: UIViewController, NYTPhotosViewControllerDelegate { +final class ViewController: UIViewController { + + let ReferencePhotoName = "NYTimesBuilding" + + var photoViewerCoordinator: PhotoViewerCoordinator? @IBOutlet weak var imageButton : UIButton? - fileprivate let photos = PhotosProvider().photos @IBAction func buttonTapped(_ sender: UIButton) { - let photosViewController = NYTPhotosViewController(photos: self.photos) + let coordinator = PhotoViewerCoordinator(provider: PhotosProvider()) + photoViewerCoordinator = coordinator + + let photosViewController = coordinator.photoViewer photosViewController.delegate = self present(photosViewController, animated: true, completion: nil) - - updateImagesOnPhotosViewController(photosViewController, afterDelayWithPhotos: photos) } - - func updateImagesOnPhotosViewController(_ photosViewController: NYTPhotosViewController, afterDelayWithPhotos: [ExamplePhoto]) { - - let delayTime = DispatchTime.now() + 5.0 - - DispatchQueue.main.asyncAfter(deadline: delayTime) { - for photo in self.photos { - if photo.image == nil { - photo.image = UIImage(named: PrimaryImageName) - photosViewController.updateImage(for: photo) - } - } - } - } - + override func viewDidLoad() { super.viewDidLoad() - let buttonImage = UIImage(named: PrimaryImageName) + + let buttonImage = UIImage(named: ReferencePhotoName) imageButton?.setBackgroundImage(buttonImage, for: UIControlState()) } - - // MARK: - NYTPhotosViewControllerDelegate +} + +// MARK: NYTPhotosViewControllerDelegate + +extension ViewController: NYTPhotosViewControllerDelegate { func photosViewController(_ photosViewController: NYTPhotosViewController, handleActionButtonTappedFor photo: NYTPhoto) -> Bool { - if UIDevice.current.userInterfaceIdiom == .pad { - guard let photoImage = photo.image else { return false } let shareActivityViewController = UIActivityViewController(activityItems: [photoImage], applicationActivities: nil) - shareActivityViewController.completionWithItemsHandler = {(activityType: UIActivityType?, completed: Bool, items: [Any]?, error: Error?) in if completed { photosViewController.delegate?.photosViewController!(photosViewController, actionCompletedWithActivityType: activityType?.rawValue) @@ -69,42 +62,16 @@ class ViewController: UIViewController, NYTPhotosViewControllerDelegate { } func photosViewController(_ photosViewController: NYTPhotosViewController, referenceViewFor photo: NYTPhoto) -> UIView? { - if photo as? ExamplePhoto == photos[NoReferenceViewPhotoIndex] { - return nil - } - return imageButton - } - - func photosViewController(_ photosViewController: NYTPhotosViewController, loadingViewFor photo: NYTPhoto) -> UIView? { - if photo as! ExamplePhoto == photos[CustomEverythingPhotoIndex] { - let label = UILabel() - label.text = "Custom Loading..." - label.textColor = UIColor.green - return label - } - return nil - } - - func photosViewController(_ photosViewController: NYTPhotosViewController, captionViewFor photo: NYTPhoto) -> UIView? { - if photo as! ExamplePhoto == photos[CustomEverythingPhotoIndex] { - let label = UILabel() - label.text = "Custom Caption View" - label.textColor = UIColor.white - label.backgroundColor = UIColor.red - return label + guard let box = photo as? NYTPhotoBox else { return nil } + + if box.value.name == ReferencePhotoName { + return imageButton } + return nil } - - func photosViewController(_ photosViewController: NYTPhotosViewController, didNavigateTo photo: NYTPhoto, at photoIndex: UInt) { - print("Did Navigate To Photo: \(photo) identifier: \(photoIndex)") - } - - func photosViewController(_ photosViewController: NYTPhotosViewController, actionCompletedWithActivityType activityType: String?) { - print("Action Completed With Activity Type: \(activityType)") - } func photosViewControllerDidDismiss(_ photosViewController: NYTPhotosViewController) { - print("Did dismiss Photo Viewer: \(photosViewController)") + photoViewerCoordinator = nil } } diff --git a/NYTPhotoViewer.xcodeproj/project.pbxproj b/NYTPhotoViewer.xcodeproj/project.pbxproj index 8a5364c8..da309f1c 100644 --- a/NYTPhotoViewer.xcodeproj/project.pbxproj +++ b/NYTPhotoViewer.xcodeproj/project.pbxproj @@ -88,13 +88,15 @@ 11FBDADF1C877BD600018169 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11FBDADE1C877BD600018169 /* AppDelegate.swift */; }; 11FBDAE11C877BD600018169 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11FBDAE01C877BD600018169 /* ViewController.swift */; }; 11FBDAE41C877BD600018169 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 11FBDAE21C877BD600018169 /* Main.storyboard */; }; - 11FBDAEF1C877C5D00018169 /* ExamplePhoto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11FBDAEE1C877C5D00018169 /* ExamplePhoto.swift */; }; 11FBDAF11C877C8B00018169 /* PhotosProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11FBDAF01C877C8B00018169 /* PhotosProvider.swift */; }; 11FBDAF71C877CEF00018169 /* NYTPhotoViewer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 111084061C875B5000699670 /* NYTPhotoViewer.framework */; }; 11FBDAF81C877CEF00018169 /* NYTPhotoViewer.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 111084061C875B5000699670 /* NYTPhotoViewer.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 11FBDAFD1C877D9A00018169 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 11FBDAFB1C877D9A00018169 /* LaunchScreen.xib */; }; 11FBDAFE1C877F5500018169 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 111084781C876A2B00699670 /* Assets.xcassets */; }; 11FBDAFF1C877F8000018169 /* giphy.gif in Resources */ = {isa = PBXBuildFile; fileRef = 111084851C876B0400699670 /* giphy.gif */; }; + 9371A73C1E438B9C00A8F2EF /* Photo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9371A73B1E438B9C00A8F2EF /* Photo.swift */; }; + 9371A7441E438BCE00A8F2EF /* PhotoBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9371A7431E438BCE00A8F2EF /* PhotoBox.swift */; }; + 9371A7461E43D61E00A8F2EF /* PhotoViewerCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9371A7451E43D61E00A8F2EF /* PhotoViewerCoordinator.swift */; }; 93F45B181E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 93F45B161E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; 93F45B191E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 93F45B161E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; 93F45B1A1E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 93F45B171E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.m */; }; @@ -289,9 +291,11 @@ 11FBDAE01C877BD600018169 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 11FBDAE31C877BD600018169 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 11FBDAEA1C877BD600018169 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 11FBDAEE1C877C5D00018169 /* ExamplePhoto.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExamplePhoto.swift; sourceTree = ""; }; 11FBDAF01C877C8B00018169 /* PhotosProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotosProvider.swift; sourceTree = ""; }; 11FBDAFC1C877D9A00018169 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 9371A73B1E438B9C00A8F2EF /* Photo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Photo.swift; sourceTree = ""; }; + 9371A7431E438BCE00A8F2EF /* PhotoBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotoBox.swift; sourceTree = ""; }; + 9371A7451E43D61E00A8F2EF /* PhotoViewerCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotoViewerCoordinator.swift; sourceTree = ""; }; 93F45B161E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoViewerSinglePhotoDataSource.h; sourceTree = ""; }; 93F45B171E3BB5610093DB93 /* NYTPhotoViewerSinglePhotoDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoViewerSinglePhotoDataSource.m; sourceTree = ""; }; /* End PBXFileReference section */ @@ -496,8 +500,10 @@ children = ( 11FBDADE1C877BD600018169 /* AppDelegate.swift */, 11FBDAE01C877BD600018169 /* ViewController.swift */, - 11FBDAEE1C877C5D00018169 /* ExamplePhoto.swift */, + 9371A7451E43D61E00A8F2EF /* PhotoViewerCoordinator.swift */, 11FBDAF01C877C8B00018169 /* PhotosProvider.swift */, + 9371A7431E438BCE00A8F2EF /* PhotoBox.swift */, + 9371A73B1E438B9C00A8F2EF /* Photo.swift */, 11FBDAE21C877BD600018169 /* Main.storyboard */, 11FBDAFB1C877D9A00018169 /* LaunchScreen.xib */, 11FBDAEA1C877BD600018169 /* Info.plist */, @@ -881,10 +887,12 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 9371A7441E438BCE00A8F2EF /* PhotoBox.swift in Sources */, 11FBDAE11C877BD600018169 /* ViewController.swift in Sources */, - 11FBDAEF1C877C5D00018169 /* ExamplePhoto.swift in Sources */, 11FBDADF1C877BD600018169 /* AppDelegate.swift in Sources */, + 9371A7461E43D61E00A8F2EF /* PhotoViewerCoordinator.swift in Sources */, 11FBDAF11C877C8B00018169 /* PhotosProvider.swift in Sources */, + 9371A73C1E438B9C00A8F2EF /* Photo.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 18b529654f37816e4c88b39fdd41e44d464192d1 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Thu, 2 Feb 2017 17:30:06 -0500 Subject: [PATCH 43/55] fix: add bounds checks before asking data source for a photo --- NYTPhotoViewer/NYTPhotosViewController.m | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/NYTPhotoViewer/NYTPhotosViewController.m b/NYTPhotoViewer/NYTPhotosViewController.m index d1a99a2f..e4a9c939 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.m +++ b/NYTPhotoViewer/NYTPhotosViewController.m @@ -561,11 +561,19 @@ - (void)photoViewController:(NYTPhotoViewController *)photoViewController didLon - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { NSUInteger photoIndex = [self.dataSource indexOfPhoto:viewController.photo]; + if (photoIndex == 0 || photoIndex == NSNotFound) { + return nil; + } + return [self newPhotoViewControllerForPhoto:[self.dataSource photoAtIndex:(photoIndex - 1)]]; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { NSUInteger photoIndex = [self.dataSource indexOfPhoto:viewController.photo]; + if (photoIndex == NSNotFound) { + return nil; + } + return [self newPhotoViewControllerForPhoto:[self.dataSource photoAtIndex:(photoIndex + 1)]]; } From bdf5fe0878604ed6cbfb3ce9f37b3c13f3b20110 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Thu, 2 Feb 2017 17:31:00 -0500 Subject: [PATCH 44/55] =?UTF-8?q?fix:=20PhotosViewController=20shouldn?= =?UTF-8?q?=E2=80=99t=20retain=20its=20data=20source?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This would lead too easily to difficult-to-manage retain cycles. --- NYTPhotoViewer/NYTPhotosViewController.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/NYTPhotoViewer/NYTPhotosViewController.h b/NYTPhotoViewer/NYTPhotosViewController.h index acb08a02..11eed4a3 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.h +++ b/NYTPhotoViewer/NYTPhotosViewController.h @@ -58,10 +58,8 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; * The data source underlying this PhotosViewController. * * After setting a new data source, you must call `-reloadPhotosAnimated:`. - * - * The data source is retained (unlike UITableView's data source). */ -@property (nonatomic) id dataSource; +@property (nonatomic, weak, nullable) id dataSource; /** * The object conforming to `NYTPhoto` that is currently being displayed by the `pageViewController`. From 6602a08d422b287e5f4aa8f76de3dddd15cf54cb Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 3 Feb 2017 10:30:14 -0500 Subject: [PATCH 45/55] Update Changelog for #227 --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd5c5acd..6263bd71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ Changes for users of the library currently on `develop`: - Expose a data-source-oriented API for PhotosViewController ([#226](https://github.com/NYTimes/NYTPhotoViewer/pull/226)) + - A data source no longer has to handle out-of-bounds indexes ([#227](https://github.com/NYTimes/NYTPhotoViewer/pull/227)) + - The data source is not retained ([#227](https://github.com/NYTimes/NYTPhotoViewer/pull/227)) ## [1.2.0](https://github.com/NYTimes/NYTPhotoViewer/releases/tag/1.2.0) From 07521697b565da140d323a7a6d8bc52040814e51 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Fri, 3 Feb 2017 10:35:10 -0500 Subject: [PATCH 46/55] Add README documentation on Example project dependency management --- README.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index aadf8429..22ac0114 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # NYTPhotoViewer -[![Platform](http://cocoapod-badges.herokuapp.com/p/NYTPhotoViewer/badge.png)](http://cocoadocs.org/docsets/NYTPhotoViewer) -[![Version](http://cocoapod-badges.herokuapp.com/v/NYTPhotoViewer/badge.png)](http://cocoadocs.org/docsets/NYTPhotoViewer) +[![Platform](http://cocoapod-badges.herokuapp.com/p/NYTPhotoViewer/badge.png)](http://cocoadocs.org/docsets/NYTPhotoViewer) +[![Version](http://cocoapod-badges.herokuapp.com/v/NYTPhotoViewer/badge.png)](http://cocoadocs.org/docsets/NYTPhotoViewer) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) NYTPhotoViewer is a slideshow and image viewer that includes double-tap to zoom, captions, support for multiple images, interactive flick to dismiss, animated zooming presentation, and more. @@ -17,6 +17,12 @@ NYTPhotosViewController *photosViewController = [[NYTPhotosViewController alloc] [self presentViewController:photosViewController animated:YES completion:nil]; ``` +## Running the Example + +The Example project uses [Carthage](https://github.com/Carthage/Carthage) to integrate its dependencies. If you don’t have Carthge installed, you can install it via [Homebrew](http://brew.sh) with `brew install carthage`. + +Then, in your checkout of the `NYTPhotoViewer` repo, run `carthage checkout --use-submodules`. + ## Installation ### Carthage @@ -36,7 +42,7 @@ If you don't want support for animated GIFs, you may instead link against only t NYTPhotoViewer is available through [CocoaPods](http://cocoapods.org). To install it, simply add the following line to your `Podfile`: ``` -pod 'NYTPhotoViewer', '~> 1.1.0' +pod 'NYTPhotoViewer' ``` ## Requirements @@ -49,7 +55,7 @@ See [`CHANGELOG.md`](https://github.com/NYTimes/NYTPhotoViewer/blob/develop/CHAN ## Swift -NYTPhotoViewer is written in Objective-C but is intended to be fully interoperable with Swift. If you experience any interoperability difficulties, please open an issue or pull request and we will work to resolve it. +NYTPhotoViewer is written in Objective-C but is fully interoperable with Swift. If you experience any interoperability difficulties, please open an issue or pull request and we will work to resolve it. ## Inspiration From 141e05bb820ccb27daf361502c2ab4a50751dfda Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Mon, 6 Feb 2017 10:58:13 -0500 Subject: [PATCH 47/55] style: make Swift-Example style tweaks, requested by @veronique for PR https://github.com/NYTimes/NYTPhotoViewer/pull/223 --- Example-Swift/Photo.swift | 3 +-- Example-Swift/ViewController.swift | 32 ++++++++++++------------------ 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/Example-Swift/Photo.swift b/Example-Swift/Photo.swift index 8be6ea59..630b1025 100644 --- a/Example-Swift/Photo.swift +++ b/Example-Swift/Photo.swift @@ -10,9 +10,8 @@ import UIKit /// A photo may often be represented in a Swift application as a value type. struct Photo { - // Ths would usually be a URL, but for this demo we load images from the bundle. + // This would usually be a URL, but for this demo we load images from the bundle. let name: String - let summary: String let credit: String diff --git a/Example-Swift/ViewController.swift b/Example-Swift/ViewController.swift index 381fcde6..85a8f1cf 100755 --- a/Example-Swift/ViewController.swift +++ b/Example-Swift/ViewController.swift @@ -42,33 +42,27 @@ final class ViewController: UIViewController { extension ViewController: NYTPhotosViewControllerDelegate { func photosViewController(_ photosViewController: NYTPhotosViewController, handleActionButtonTappedFor photo: NYTPhoto) -> Bool { - if UIDevice.current.userInterfaceIdiom == .pad { - guard let photoImage = photo.image else { return false } - - let shareActivityViewController = UIActivityViewController(activityItems: [photoImage], applicationActivities: nil) - shareActivityViewController.completionWithItemsHandler = {(activityType: UIActivityType?, completed: Bool, items: [Any]?, error: Error?) in - if completed { - photosViewController.delegate?.photosViewController!(photosViewController, actionCompletedWithActivityType: activityType?.rawValue) - } + guard UIDevice.current.userInterfaceIdiom == .pad, let photoImage = photo.image else { + return false + } + + let shareActivityViewController = UIActivityViewController(activityItems: [photoImage], applicationActivities: nil) + shareActivityViewController.completionWithItemsHandler = {(activityType: UIActivityType?, completed: Bool, items: [Any]?, error: Error?) in + if completed { + photosViewController.delegate?.photosViewController!(photosViewController, actionCompletedWithActivityType: activityType?.rawValue) } + } - shareActivityViewController.popoverPresentationController?.barButtonItem = photosViewController.rightBarButtonItem - photosViewController.present(shareActivityViewController, animated: true, completion: nil) + shareActivityViewController.popoverPresentationController?.barButtonItem = photosViewController.rightBarButtonItem + photosViewController.present(shareActivityViewController, animated: true, completion: nil) - return true - } - - return false + return true } func photosViewController(_ photosViewController: NYTPhotosViewController, referenceViewFor photo: NYTPhoto) -> UIView? { guard let box = photo as? NYTPhotoBox else { return nil } - if box.value.name == ReferencePhotoName { - return imageButton - } - - return nil + return box.value.name == ReferencePhotoName ? imageButton : nil } func photosViewControllerDidDismiss(_ photosViewController: NYTPhotosViewController) { From 76fc061cffacb8dfb592247bca26a8e47ac9ce89 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Mon, 6 Feb 2017 11:00:26 -0500 Subject: [PATCH 48/55] Remove no-longer-necessary bounds check in Swift Example --- Example-Swift/PhotoViewerCoordinator.swift | 3 --- 1 file changed, 3 deletions(-) diff --git a/Example-Swift/PhotoViewerCoordinator.swift b/Example-Swift/PhotoViewerCoordinator.swift index 478e65c1..ae25b91a 100644 --- a/Example-Swift/PhotoViewerCoordinator.swift +++ b/Example-Swift/PhotoViewerCoordinator.swift @@ -48,9 +48,6 @@ final class PhotoViewerCoordinator: NYTPhotoViewerDataSource { @objc func photo(at index: Int) -> NYTPhoto? { guard index < slideshow.count else { return nil } - guard index >= 0 else { - fatalError() - } return slideshow[index] } } From 4bea18d2de813150366f8bc53f37de9554e2f0ec Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Wed, 15 Feb 2017 16:59:02 -0500 Subject: [PATCH 49/55] style: remove unnecessary Array initializer call --- Example-Swift/PhotosProvider.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Example-Swift/PhotosProvider.swift b/Example-Swift/PhotosProvider.swift index dcb5a6f4..e5dc437b 100755 --- a/Example-Swift/PhotosProvider.swift +++ b/Example-Swift/PhotosProvider.swift @@ -14,7 +14,7 @@ final class PhotosProvider { /// Simulate a synchronous fetch of a slideshow, perhaps from a local database. func fetchDemoSlideshow() -> Slideshow { - return Array(0...4).map { demoPhoto(identifier: $0) } + return (0...4).map { demoPhoto(identifier: $0) } } /// Simulate fetching a photo from the network. From 0ecbb02fcd84911fe6f898267df42188ac96d068 Mon Sep 17 00:00:00 2001 From: Chris Dzombak Date: Thu, 16 Feb 2017 11:34:52 -0500 Subject: [PATCH 50/55] Add initial contributing guidelines MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that develop is not the default, I’d like to clarify where PRs should go. --- .github/PULL_REQUEST_TEMPLATE.md | 7 +++++++ README.md | 4 ++++ 2 files changed, 11 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..0839124e --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,7 @@ + diff --git a/README.md b/README.md index 22ac0114..3e8a4116 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,10 @@ This library requires a deployment target of iOS 8.0 or greater. See [`CHANGELOG.md`](https://github.com/NYTimes/NYTPhotoViewer/blob/develop/CHANGELOG.md). +## Contributing + +Please **open pull requests against the `develop` branch**, and add a relevant note to the [`develop` section of the CHANGELOG](https://github.com/NYTimes/NYTPhotoViewer/blob/develop/CHANGELOG.md#develop) as part of your pull request. + ## Swift NYTPhotoViewer is written in Objective-C but is fully interoperable with Swift. If you experience any interoperability difficulties, please open an issue or pull request and we will work to resolve it. From b58acb1ccdf1c3bf4b1cdf20729b8ad4b3ba2248 Mon Sep 17 00:00:00 2001 From: Alex Brashear Date: Mon, 6 Nov 2017 19:08:52 -0500 Subject: [PATCH 51/55] feat: provide option to respect safe area insets. --- NYTPhotoViewer/NYTPhotosOverlayView.h | 5 ++++ NYTPhotoViewer/NYTPhotosOverlayView.m | 38 ++++++++++++++++++------ NYTPhotoViewer/NYTPhotosViewController.h | 10 +++++++ NYTPhotoViewer/NYTPhotosViewController.m | 8 ++++- 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/NYTPhotoViewer/NYTPhotosOverlayView.h b/NYTPhotoViewer/NYTPhotosOverlayView.h index cca8d9d4..f62c52dd 100644 --- a/NYTPhotoViewer/NYTPhotosOverlayView.h +++ b/NYTPhotoViewer/NYTPhotosOverlayView.h @@ -55,6 +55,11 @@ NS_ASSUME_NONNULL_BEGIN */ @property (nonatomic, nullable) UIView *captionView; +/** + * Whether the `captionView` should respect the safe area or not + */ +@property (nonatomic) BOOL captionViewRespectsSafeArea; + @end NS_ASSUME_NONNULL_END diff --git a/NYTPhotoViewer/NYTPhotosOverlayView.m b/NYTPhotoViewer/NYTPhotosOverlayView.m index fc001066..8ee2fb57 100644 --- a/NYTPhotoViewer/NYTPhotosOverlayView.m +++ b/NYTPhotoViewer/NYTPhotosOverlayView.m @@ -9,6 +9,12 @@ #import "NYTPhotosOverlayView.h" #import "NYTPhotoCaptionViewLayoutWidthHinting.h" +@interface UIView (NYTSafeArea) + +@property (nonatomic, readonly, strong) UILayoutGuide *safeAreaLayoutGuide; + +@end + @interface NYTPhotosOverlayView () @property (nonatomic) UINavigationItem *navigationItem; @@ -74,10 +80,17 @@ - (void)setupNavigationBar { [self addSubview:self.navigationBar]; - NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.navigationBar attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]; - NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self.navigationBar attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]; - NSLayoutConstraint *horizontalPositionConstraint = [NSLayoutConstraint constraintWithItem:self.navigationBar attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]; - [self addConstraints:@[topConstraint, widthConstraint, horizontalPositionConstraint]]; + if ([self respondsToSelector:@selector(safeAreaLayoutGuide)]) { + NSLayoutConstraint *topConstraint = [self.navigationBar.topAnchor constraintEqualToAnchor:self.safeAreaLayoutGuide.topAnchor]; + NSLayoutConstraint *leftConstraint = [self.navigationBar.leftAnchor constraintEqualToAnchor:self.safeAreaLayoutGuide.leftAnchor]; + NSLayoutConstraint *rightConstraint = [self.navigationBar.rightAnchor constraintEqualToAnchor:self.safeAreaLayoutGuide.rightAnchor]; + [self addConstraints:@[topConstraint, leftConstraint, rightConstraint]]; + } else { + NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.navigationBar attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]; + NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self.navigationBar attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]; + NSLayoutConstraint *horizontalPositionConstraint = [NSLayoutConstraint constraintWithItem:self.navigationBar attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]; + [self addConstraints:@[topConstraint, widthConstraint, horizontalPositionConstraint]]; + } } - (void)setCaptionView:(UIView *)captionView { @@ -91,11 +104,18 @@ - (void)setCaptionView:(UIView *)captionView { self.captionView.translatesAutoresizingMaskIntoConstraints = NO; [self addSubview:self.captionView]; - - NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:self.captionView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0]; - NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self.captionView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]; - NSLayoutConstraint *horizontalPositionConstraint = [NSLayoutConstraint constraintWithItem:self.captionView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]; - [self addConstraints:@[bottomConstraint, widthConstraint, horizontalPositionConstraint]]; + + if ([self respondsToSelector:@selector(safeAreaLayoutGuide)] && self.captionViewRespectsSafeArea) { + NSLayoutConstraint *bottomConstraint = [self.captionView.bottomAnchor constraintEqualToAnchor:self.safeAreaLayoutGuide.bottomAnchor]; + NSLayoutConstraint *leftConstraint = [self.captionView.leftAnchor constraintEqualToAnchor:self.safeAreaLayoutGuide.leftAnchor]; + NSLayoutConstraint *rightConstraint = [self.captionView.rightAnchor constraintEqualToAnchor:self.safeAreaLayoutGuide.rightAnchor]; + [self addConstraints:@[bottomConstraint, leftConstraint, rightConstraint]]; + } else { + NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:self.captionView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0]; + NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self.captionView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]; + NSLayoutConstraint *horizontalPositionConstraint = [NSLayoutConstraint constraintWithItem:self.captionView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]; + [self addConstraints:@[bottomConstraint, widthConstraint, horizontalPositionConstraint]]; + } } - (UIBarButtonItem *)leftBarButtonItem { diff --git a/NYTPhotoViewer/NYTPhotosViewController.h b/NYTPhotoViewer/NYTPhotosViewController.h index 11eed4a3..06098177 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.h +++ b/NYTPhotoViewer/NYTPhotosViewController.h @@ -213,6 +213,16 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; */ - (UIView * _Nullable)photosViewController:(NYTPhotosViewController *)photosViewController captionViewForPhoto:(id )photo; +/** + * Returns whether the caption view should respect the safe area. + * + * @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. + * @param photo The photo object over which to display the caption view. + * + * @return A `BOOL` indicating whether the caption view should respect the safe area for the given photo or not. + */ +- (BOOL)photosViewController:(NYTPhotosViewController *)photosViewController captionViewRespectsSafeAreaForPhoto:(id )photo; + /** * Returns a string to display as the title in the navigation-bar area for a photo. * diff --git a/NYTPhotoViewer/NYTPhotosViewController.m b/NYTPhotoViewer/NYTPhotosViewController.m index e4a9c939..7b2c0917 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.m +++ b/NYTPhotoViewer/NYTPhotosViewController.m @@ -260,7 +260,13 @@ - (void)updateOverlayInformation { if (!captionView) { captionView = [[NYTPhotoCaptionView alloc] initWithAttributedTitle:self.currentlyDisplayedPhoto.attributedCaptionTitle attributedSummary:self.currentlyDisplayedPhoto.attributedCaptionSummary attributedCredit:self.currentlyDisplayedPhoto.attributedCaptionCredit]; } - + + BOOL captionViewRespectsSafeArea = YES; + if ([self.delegate respondsToSelector:@selector(photosViewController:captionViewRespectsSafeAreaForPhoto:)]) { + captionViewRespectsSafeArea = [self.delegate photosViewController:self captionViewRespectsSafeAreaForPhoto:self.currentlyDisplayedPhoto]; + } + + self.overlayView.captionViewRespectsSafeArea = captionViewRespectsSafeArea; self.overlayView.captionView = captionView; } From 369315a20aa87e6dc9379fdbebe8efe4081d8eef Mon Sep 17 00:00:00 2001 From: Alex Brashear Date: Mon, 6 Nov 2017 19:34:31 -0500 Subject: [PATCH 52/55] chore: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6263bd71..17bf98fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Changes for users of the library currently on `develop`: - Expose a data-source-oriented API for PhotosViewController ([#226](https://github.com/NYTimes/NYTPhotoViewer/pull/226)) - A data source no longer has to handle out-of-bounds indexes ([#227](https://github.com/NYTimes/NYTPhotoViewer/pull/227)) - The data source is not retained ([#227](https://github.com/NYTimes/NYTPhotoViewer/pull/227)) +- Respect safe areas for iOS 11 support ## [1.2.0](https://github.com/NYTimes/NYTPhotoViewer/releases/tag/1.2.0) From e462919acc527ece8b364838843e748e0396403e Mon Sep 17 00:00:00 2001 From: alexbrashear Date: Tue, 7 Nov 2017 14:48:31 -0500 Subject: [PATCH 53/55] feat: hide home indicator --- NYTPhotoViewer/NYTPhotoViewController.m | 4 ++++ NYTPhotoViewer/NYTPhotosViewController.m | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/NYTPhotoViewer/NYTPhotoViewController.m b/NYTPhotoViewer/NYTPhotoViewController.m index d37b25f6..301854c9 100644 --- a/NYTPhotoViewer/NYTPhotoViewController.m +++ b/NYTPhotoViewer/NYTPhotoViewController.m @@ -80,6 +80,10 @@ - (void)viewWillLayoutSubviews { self.loadingView.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds)); } +- (BOOL)prefersHomeIndicatorAutoHidden { + return YES; +} + #pragma mark - NYTPhotoViewController - (instancetype)initWithPhoto:(id )photo loadingView:(UIView *)loadingView notificationCenter:(NSNotificationCenter *)notificationCenter { diff --git a/NYTPhotoViewer/NYTPhotosViewController.m b/NYTPhotoViewer/NYTPhotosViewController.m index 7b2c0917..79e3281b 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.m +++ b/NYTPhotoViewer/NYTPhotosViewController.m @@ -148,6 +148,10 @@ - (BOOL)prefersStatusBarHidden { return YES; } +- (BOOL)prefersHomeIndicatorAutoHidden { + return YES; +} + - (UIStatusBarAnimation)preferredStatusBarUpdateAnimation { return UIStatusBarAnimationFade; } From 0b4123fac4b51d44be51908cb01318fbcdead5b1 Mon Sep 17 00:00:00 2001 From: alexbrashear Date: Tue, 7 Nov 2017 15:55:26 -0500 Subject: [PATCH 54/55] docs: add note about default value --- NYTPhotoViewer/NYTPhotosViewController.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NYTPhotoViewer/NYTPhotosViewController.h b/NYTPhotoViewer/NYTPhotosViewController.h index 06098177..be8a9845 100644 --- a/NYTPhotoViewer/NYTPhotosViewController.h +++ b/NYTPhotoViewer/NYTPhotosViewController.h @@ -216,6 +216,8 @@ extern NSString * const NYTPhotosViewControllerDidDismissNotification; /** * Returns whether the caption view should respect the safe area. * + * @note If this method is not implemented it will default to `YES`. + * * @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. * @param photo The photo object over which to display the caption view. * From 64445c779f19a6626061a54d8ac2f061e094ab4c Mon Sep 17 00:00:00 2001 From: Alex Brashear Date: Mon, 11 Dec 2017 13:29:36 -0500 Subject: [PATCH 55/55] Bump to version 2.0.0 --- NYTPhotoViewer.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NYTPhotoViewer.podspec b/NYTPhotoViewer.podspec index 25eb1533..6fe70c84 100644 --- a/NYTPhotoViewer.podspec +++ b/NYTPhotoViewer.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "NYTPhotoViewer" - s.version = "1.2.0" + s.version = "2.0.0" s.description = <<-DESC NYTPhotoViewer is a slideshow and image viewer that includes double tap to zoom, captions, support for multiple images, interactive flick to dismiss, animated zooming presentation, and more.