diff --git a/Example/NYTPhotoViewer/NYTViewController.m b/Example/NYTPhotoViewer/NYTViewController.m index fa46e12e..f5fdb425 100644 --- a/Example/NYTPhotoViewer/NYTViewController.m +++ b/Example/NYTPhotoViewer/NYTViewController.m @@ -10,10 +10,15 @@ #import #import "NYTExamplePhoto.h" -static const NSUInteger NYTViewControllerCustomEverythingPhotoIndex = 1; -static const NSUInteger NYTViewControllerDefaultLoadingSpinnerPhotoIndex = 3; -static const NSUInteger NYTViewControllerNoReferenceViewPhotoIndex = 4; -static const NSUInteger NYTViewControllerCustomMaxZoomScalePhotoIndex = 5; +typedef NS_ENUM(NSUInteger, NYTViewControllerPhotoIndex) { + NYTViewControllerPhotoIndexCustomEverything = 1, + NYTViewControllerPhotoIndexLongCaption = 2, + NYTViewControllerPhotoIndexDefaultLoadingSpinner = 3, + NYTViewControllerPhotoIndexNoReferenceView = 4, + NYTViewControllerPhotoIndexCustomMaxZoomScale = 5, + NYTViewControllerPhotoIndexGif = 6, + NYTViewControllerPhotoCount, +}; @interface NYTViewController () @@ -51,26 +56,51 @@ - (void)updateImagesOnPhotosViewController:(NYTPhotosViewController *)photosView + (NSArray *)newTestPhotos { NSMutableArray *photos = [NSMutableArray array]; - int limit = 7; - for (int i = 0; i < limit; i++) { + for (NSUInteger i = 0; i < NYTViewControllerPhotoCount; i++) { NYTExamplePhoto *photo = [[NYTExamplePhoto alloc] init]; - if (i == limit - 1) { + 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 == NYTViewControllerCustomEverythingPhotoIndex || i == NYTViewControllerDefaultLoadingSpinnerPhotoIndex) { - photo.image = nil; - } - if (i == NYTViewControllerCustomEverythingPhotoIndex) { + 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]}]; - photo.attributedCaptionSummary = [[NSAttributedString alloc] initWithString:@"summary" attributes:@{NSForegroundColorAttributeName: [UIColor grayColor]}]; - photo.attributedCaptionCredit = [[NSAttributedString alloc] initWithString:@"credit" attributes:@{NSForegroundColorAttributeName: [UIColor darkGrayColor]}]; + 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:@"credit" attributes:@{NSForegroundColorAttributeName: [UIColor grayColor], NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]}]; + [photos addObject:photo]; } @@ -80,7 +110,7 @@ + (NSArray *)newTestPhotos { #pragma mark - NYTPhotosViewControllerDelegate - (UIView *)photosViewController:(NYTPhotosViewController *)photosViewController referenceViewForPhoto:(id )photo { - if ([photo isEqual:self.photos[NYTViewControllerNoReferenceViewPhotoIndex]]) { + if ([photo isEqual:self.photos[NYTViewControllerPhotoIndexNoReferenceView]]) { return nil; } @@ -88,7 +118,7 @@ - (UIView *)photosViewController:(NYTPhotosViewController *)photosViewController } - (UIView *)photosViewController:(NYTPhotosViewController *)photosViewController loadingViewForPhoto:(id )photo { - if ([photo isEqual:self.photos[NYTViewControllerCustomEverythingPhotoIndex]]) { + if ([photo isEqual:self.photos[NYTViewControllerPhotoIndexCustomEverything]]) { UILabel *loadingLabel = [[UILabel alloc] init]; loadingLabel.text = @"Custom Loading..."; loadingLabel.textColor = [UIColor greenColor]; @@ -99,7 +129,7 @@ - (UIView *)photosViewController:(NYTPhotosViewController *)photosViewController } - (UIView *)photosViewController:(NYTPhotosViewController *)photosViewController captionViewForPhoto:(id )photo { - if ([photo isEqual:self.photos[NYTViewControllerCustomEverythingPhotoIndex]]) { + if ([photo isEqual:self.photos[NYTViewControllerPhotoIndexCustomEverything]]) { UILabel *label = [[UILabel alloc] init]; label.text = @"Custom Caption View"; label.textColor = [UIColor whiteColor]; @@ -111,7 +141,7 @@ - (UIView *)photosViewController:(NYTPhotosViewController *)photosViewController } - (CGFloat)photosViewController:(NYTPhotosViewController *)photosViewController maximumZoomScaleForPhoto:(id )photo { - if ([photo isEqual:self.photos[NYTViewControllerCustomMaxZoomScalePhotoIndex]]) { + if ([photo isEqual:self.photos[NYTViewControllerPhotoIndexCustomMaxZoomScale]]) { return 10.0f; } @@ -119,7 +149,7 @@ - (CGFloat)photosViewController:(NYTPhotosViewController *)photosViewController } - (NSDictionary *)photosViewController:(NYTPhotosViewController *)photosViewController overlayTitleTextAttributesForPhoto:(id )photo { - if ([photo isEqual:self.photos[NYTViewControllerCustomEverythingPhotoIndex]]) { + if ([photo isEqual:self.photos[NYTViewControllerPhotoIndexCustomEverything]]) { return @{NSForegroundColorAttributeName: [UIColor grayColor]}; } diff --git a/Example/Podfile.lock b/Example/Podfile.lock index aaf6af69..ba4882f1 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,7 +1,7 @@ PODS: - - FLAnimatedImage (1.0.8) + - FLAnimatedImage (1.0.10) - NYTPhotoViewer/AnimatedGifSupport (0.1.2): - - FLAnimatedImage (= 1.0.8) + - FLAnimatedImage (~> 1.0.8) - NYTPhotoViewer/Core - NYTPhotoViewer/Core (0.1.2) - OCMock (3.2) @@ -15,8 +15,8 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - FLAnimatedImage: f9422f796135aff80d8c00b2afc48015bb746e24 - NYTPhotoViewer: e348bfa437398deb67a88b7928e85168ac38b5df + FLAnimatedImage: e16a1e1cef08e4c509b47e4acbe3923f65c16135 + NYTPhotoViewer: 06876beb4c9bc6f10a59eb8b898c480fd89f7c51 OCMock: 28def049ef47f996b515a8eeea958be7ccab2dbb COCOAPODS: 0.39.0 diff --git a/Example/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h b/Example/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h new file mode 100644 index 00000000..90634910 --- /dev/null +++ b/Example/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h @@ -0,0 +1,82 @@ +// +// FLAnimatedImage.h +// Flipboard +// +// Created by Raphael Schaad on 7/8/13. +// Copyright (c) 2013-2015 Flipboard. All rights reserved. +// + + +#import + +// Allow user classes conveniently just importing one header. +#import "FLAnimatedImageView.h" + + +#ifndef NS_DESIGNATED_INITIALIZER + #if __has_attribute(objc_designated_initializer) + #define NS_DESIGNATED_INITIALIZER __attribute((objc_designated_initializer)) + #else + #define NS_DESIGNATED_INITIALIZER + #endif +#endif + +extern const NSTimeInterval kFLAnimatedImageDelayTimeIntervalMinimum; + +// +// An `FLAnimatedImage`'s job is to deliver frames in a highly performant way and works in conjunction with `FLAnimatedImageView`. +// It subclasses `NSObject` and not `UIImage` because it's only an "image" in the sense that a sea lion is a lion. +// It tries to intelligently choose the frame cache size depending on the image and memory situation with the goal to lower CPU usage for smaller ones, lower memory usage for larger ones and always deliver frames for high performant play-back. +// Note: `posterImage`, `size`, `loopCount`, `delayTimes` and `frameCount` don't change after successful initialization. +// +@interface FLAnimatedImage : NSObject + +@property (nonatomic, strong, readonly) UIImage *posterImage; // Guaranteed to be loaded; usually equivalent to `-imageLazilyCachedAtIndex:0` +@property (nonatomic, assign, readonly) CGSize size; // The `.posterImage`'s `.size` + +@property (nonatomic, assign, readonly) NSUInteger loopCount; // 0 means repeating the animation indefinitely +@property (nonatomic, strong, readonly) NSDictionary *delayTimesForIndexes; // Of type `NSTimeInterval` boxed in `NSNumber`s +@property (nonatomic, assign, readonly) NSUInteger frameCount; // Number of valid frames; equal to `[.delayTimes count]` + +@property (nonatomic, assign, readonly) NSUInteger frameCacheSizeCurrent; // Current size of intelligently chosen buffer window; can range in the interval [1..frameCount] +@property (nonatomic, assign) NSUInteger frameCacheSizeMax; // Allow to cap the cache size; 0 means no specific limit (default) + +// Intended to be called from main thread synchronously; will return immediately. +// If the result isn't cached, will return `nil`; the caller should then pause playback, not increment frame counter and keep polling. +// After an initial loading time, depending on `frameCacheSize`, frames should be available immediately from the cache. +- (UIImage *)imageLazilyCachedAtIndex:(NSUInteger)index; + +// Pass either a `UIImage` or an `FLAnimatedImage` and get back its size ++ (CGSize)sizeForImage:(id)image; + +// On success, the initializers return an `FLAnimatedImage` with all fields initialized, on failure they return `nil` and an error will be logged. +- (instancetype)initWithAnimatedGIFData:(NSData *)data NS_DESIGNATED_INITIALIZER; ++ (instancetype)animatedImageWithGIFData:(NSData *)data; + +@property (nonatomic, strong, readonly) NSData *data; // The data the receiver was initialized with; read-only + +@end + +typedef NS_ENUM(NSUInteger, FLLogLevel) { + FLLogLevelNone = 0, + FLLogLevelError, + FLLogLevelWarn, + FLLogLevelInfo, + FLLogLevelDebug, + FLLogLevelVerbose +}; + +@interface FLAnimatedImage (Logging) + ++ (void)setLogBlock:(void (^)(NSString *logString, FLLogLevel logLevel))logBlock logLevel:(FLLogLevel)logLevel; ++ (void)logStringFromBlock:(NSString *(^)(void))stringBlock withLevel:(FLLogLevel)level; + +@end + +#define FLLog(logLevel, format, ...) [FLAnimatedImage logStringFromBlock:^NSString *{ return [NSString stringWithFormat:(format), ## __VA_ARGS__]; } withLevel:(logLevel)] + +@interface FLWeakProxy : NSProxy + ++ (instancetype)weakProxyForObject:(id)targetObject; + +@end diff --git a/Example/Pods/FLAnimatedImage/FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImage.m b/Example/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m similarity index 82% rename from Example/Pods/FLAnimatedImage/FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImage.m rename to Example/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m index 0f29e115..64d66bda 100755 --- a/Example/Pods/FLAnimatedImage/FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImage.m +++ b/Example/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m @@ -3,7 +3,7 @@ // Flipboard // // Created by Raphael Schaad on 7/8/13. -// Copyright (c) 2013-2014 Flipboard. All rights reserved. +// Copyright (c) 2013-2015 Flipboard. All rights reserved. // @@ -19,22 +19,8 @@ #define MEGABYTE (1024 * 1024) -#if FLLumberjackIntegrationEnabled && defined(FLLumberjackAvailable) - #if DEBUG - #if defined (LOG_LEVEL_DEBUG) // CocoaLumberjack 1.x - int flAnimatedImageLogLevel = LOG_LEVEL_DEBUG; - #else // CocoaLumberjack 2.x - int flAnimatedImageLogLevel = DDLogFlagDebug; - #endif - #else - #if defined (LOG_LEVEL_WARN) // CocoaLumberjack 1.x - int flAnimatedImageLogLevel = LOG_LEVEL_WARN; - #else // CocoaLumberjack 2.x - int flAnimatedImageLogLevel = DDLogFlagWarning; - #endif - #endif -#endif - +// This is how the fastest browsers do it as per 2012: http://nullsleep.tumblr.com/post/16524517190/animated-gif-minimum-frame-delay-browser-compatibility +const NSTimeInterval kFLAnimatedImageDelayTimeIntervalMinimum = 0.02; // An animated image's data size (dimensions * frameCount) category; its value is the max allowed memory (in MB). // E.g.: A 100x200px GIF with 30 frames is ~2.3MB in our pixel format and would fall into the `FLAnimatedImageDataSizeCategoryAll` category. @@ -53,13 +39,23 @@ typedef NS_ENUM(NSUInteger, FLAnimatedImageFrameCacheSize) { }; +#if defined(DEBUG) && DEBUG +@protocol FLAnimatedImageDebugDelegate +@optional +- (void)debug_animatedImage:(FLAnimatedImage *)animatedImage didUpdateCachedFrames:(NSIndexSet *)indexesOfFramesInCache; +- (void)debug_animatedImage:(FLAnimatedImage *)animatedImage didRequestCachedFrame:(NSUInteger)index; +- (CGFloat)debug_animatedImagePredrawingSlowdownFactor:(FLAnimatedImage *)animatedImage; +@end +#endif + + @interface FLAnimatedImage () @property (nonatomic, assign, readonly) NSUInteger frameCacheSizeOptimal; // The optimal number of frames to cache based on image size & number of frames; never changes @property (nonatomic, assign) NSUInteger frameCacheSizeMaxInternal; // Allow to cap the cache size e.g. when memory warnings occur; 0 means no specific limit (default) @property (nonatomic, assign) NSUInteger requestedFrameIndex; // Most recently requested frame index @property (nonatomic, assign, readonly) NSUInteger posterImageFrameIndex; // Index of non-purgable poster image; never changes -@property (nonatomic, strong, readonly) NSMutableArray *cachedFrames; // Uncached frame indexes hold `NSNull` +@property (nonatomic, strong, readonly) NSMutableDictionary *cachedFramesForIndexes; @property (nonatomic, strong, readonly) NSMutableIndexSet *cachedFrameIndexes; // Indexes of cached frames @property (nonatomic, strong, readonly) NSMutableIndexSet *requestedFrameIndexes; // Indexes of frames that are currently produced in the background @property (nonatomic, strong, readonly) NSIndexSet *allFramesIndexSet; // Default index set with the full range of indexes; never changes @@ -72,6 +68,10 @@ @interface FLAnimatedImage () // The actual type of the object is `FLWeakProxy`. @property (nonatomic, strong, readonly) FLAnimatedImage *weakProxy; +#if defined(DEBUG) && DEBUG +@property (nonatomic, weak) id debug_delegate; +#endif + @end @@ -165,7 +165,7 @@ - (instancetype)init { FLAnimatedImage *animatedImage = [self initWithAnimatedGIFData:nil]; if (!animatedImage) { - FLLogError(@"Use `-initWithAnimatedGIFData:` and supply the animated GIF data as an argument to initialize an object of type `FLAnimatedImage`."); + FLLog(FLLogLevelError, @"Use `-initWithAnimatedGIFData:` and supply the animated GIF data as an argument to initialize an object of type `FLAnimatedImage`."); } return animatedImage; } @@ -176,7 +176,7 @@ - (instancetype)initWithAnimatedGIFData:(NSData *)data // Early return if no data supplied! BOOL hasData = ([data length] > 0); if (!hasData) { - FLLogError(@"No animated GIF data supplied."); + FLLog(FLLogLevelError, @"No animated GIF data supplied."); return nil; } @@ -189,16 +189,16 @@ - (instancetype)initWithAnimatedGIFData:(NSData *)data _data = data; // Initialize internal data structures - // We'll fill in the initial `NSNull` values below, when we loop through all frames. - _cachedFrames = [[NSMutableArray alloc] init]; + _cachedFramesForIndexes = [[NSMutableDictionary alloc] init]; _cachedFrameIndexes = [[NSMutableIndexSet alloc] init]; _requestedFrameIndexes = [[NSMutableIndexSet alloc] init]; // Note: We could leverage `CGImageSourceCreateWithURL` too to add a second initializer `-initWithAnimatedGIFContentsOfURL:`. - _imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL); + _imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)data, + (__bridge CFDictionaryRef)@{(NSString *)kCGImageSourceShouldCache: @NO}); // Early return on failure! if (!_imageSource) { - FLLogError(@"Failed to `CGImageSourceCreateWithData` for animated GIF data %@", data); + FLLog(FLLogLevelError, @"Failed to `CGImageSourceCreateWithData` for animated GIF data %@", data); return nil; } @@ -206,7 +206,7 @@ - (instancetype)initWithAnimatedGIFData:(NSData *)data CFStringRef imageSourceContainerType = CGImageSourceGetType(_imageSource); BOOL isGIFData = UTTypeConformsTo(imageSourceContainerType, kUTTypeGIF); if (!isGIFData) { - FLLogError(@"Supplied data is of type %@ and doesn't seem to be GIF data %@", imageSourceContainerType, data); + FLLog(FLLogLevelError, @"Supplied data is of type %@ and doesn't seem to be GIF data %@", imageSourceContainerType, data); return nil; } @@ -225,7 +225,8 @@ - (instancetype)initWithAnimatedGIFData:(NSData *)data // Iterate through frame images size_t imageCount = CGImageSourceGetCount(_imageSource); - NSMutableArray *delayTimesMutable = [NSMutableArray arrayWithCapacity:imageCount]; + NSUInteger skippedFrameCount = 0; + NSMutableDictionary *delayTimesForIndexesMutable = [NSMutableDictionary dictionaryWithCapacity:imageCount]; for (size_t i = 0; i < imageCount; i++) { CGImageRef frameImageRef = CGImageSourceCreateImageAtIndex(_imageSource, i, NULL); if (frameImageRef) { @@ -239,12 +240,8 @@ - (instancetype)initWithAnimatedGIFData:(NSData *)data _size = _posterImage.size; // Remember index of poster image so we never purge it; also add it to the cache. _posterImageFrameIndex = i; - self.cachedFrames[self.posterImageFrameIndex] = self.posterImage; + [self.cachedFramesForIndexes setObject:self.posterImage forKey:@(self.posterImageFrameIndex)]; [self.cachedFrameIndexes addIndex:self.posterImageFrameIndex]; - } else { - // Placeholder indicates that we don't have a cached frame. - // We use an array instead of a dictionary for slightly faster access. - self.cachedFrames[i] = [NSNull null]; } // Get `DelayTime` @@ -273,46 +270,46 @@ - (instancetype)initWithAnimatedGIFData:(NSData *)data const NSTimeInterval kDelayTimeIntervalDefault = 0.1; if (!delayTime) { if (i == 0) { - FLLogInfo(@"Falling back to default delay time for first frame %@ because none found in GIF properties %@", frameImage, frameProperties); + FLLog(FLLogLevelInfo, @"Falling back to default delay time for first frame %@ because none found in GIF properties %@", frameImage, frameProperties); delayTime = @(kDelayTimeIntervalDefault); } else { - FLLogInfo(@"Falling back to preceding delay time for frame %zu %@ because none found in GIF properties %@", i, frameImage, frameProperties); - delayTime = delayTimesMutable[i - 1]; + FLLog(FLLogLevelInfo, @"Falling back to preceding delay time for frame %zu %@ because none found in GIF properties %@", i, frameImage, frameProperties); + delayTime = delayTimesForIndexesMutable[@(i - 1)]; } } - // Support frame delays as low as `kDelayTimeIntervalMinimum`, with anything below being rounded up to `kDelayTimeIntervalDefault` for legacy compatibility. - // This is how the fastest browsers do it as per 2012: http://nullsleep.tumblr.com/post/16524517190/animated-gif-minimum-frame-delay-browser-compatibility - const NSTimeInterval kDelayTimeIntervalMinimum = 0.02; + // Support frame delays as low as `kFLAnimatedImageDelayTimeIntervalMinimum`, with anything below being rounded up to `kDelayTimeIntervalDefault` for legacy compatibility. // To support the minimum even when rounding errors occur, use an epsilon when comparing. We downcast to float because that's what we get for delayTime from ImageIO. - if ([delayTime floatValue] < ((float)kDelayTimeIntervalMinimum - FLT_EPSILON)) { - FLLogInfo(@"Rounding frame %zu's `delayTime` from %f up to default %f (minimum supported: %f).", i, [delayTime floatValue], kDelayTimeIntervalDefault, kDelayTimeIntervalMinimum); + if ([delayTime floatValue] < ((float)kFLAnimatedImageDelayTimeIntervalMinimum - FLT_EPSILON)) { + FLLog(FLLogLevelInfo, @"Rounding frame %zu's `delayTime` from %f up to default %f (minimum supported: %f).", i, [delayTime floatValue], kDelayTimeIntervalDefault, kFLAnimatedImageDelayTimeIntervalMinimum); delayTime = @(kDelayTimeIntervalDefault); } - delayTimesMutable[i] = delayTime; + delayTimesForIndexesMutable[@(i)] = delayTime; } else { - FLLogInfo(@"Dropping frame %zu because valid `CGImageRef` %@ did result in `nil`-`UIImage`.", i, frameImageRef); + skippedFrameCount++; + FLLog(FLLogLevelInfo, @"Dropping frame %zu because valid `CGImageRef` %@ did result in `nil`-`UIImage`.", i, frameImageRef); } CFRelease(frameImageRef); } else { - FLLogInfo(@"Dropping frame %zu because failed to `CGImageSourceCreateImageAtIndex` with image source %@", i, _imageSource); + skippedFrameCount++; + FLLog(FLLogLevelInfo, @"Dropping frame %zu because failed to `CGImageSourceCreateImageAtIndex` with image source %@", i, _imageSource); } } - _delayTimes = [delayTimesMutable copy]; - _frameCount = [_delayTimes count]; + _delayTimesForIndexes = [delayTimesForIndexesMutable copy]; + _frameCount = imageCount; if (self.frameCount == 0) { - FLLogInfo(@"Failed to create any valid frames for GIF with properties %@", imageProperties); + FLLog(FLLogLevelInfo, @"Failed to create any valid frames for GIF with properties %@", imageProperties); return nil; } else if (self.frameCount == 1) { // Warn when we only have a single frame but return a valid GIF. - FLLogInfo(@"Created valid GIF but with only a single frame. Image properties: %@", imageProperties); + FLLog(FLLogLevelInfo, @"Created valid GIF but with only a single frame. Image properties: %@", imageProperties); } else { // We have multiple frames, rock on! } // Calculate the optimal frame cache size: try choosing a larger buffer window depending on the predicted image size. // It's only dependent on the image size & number of frames and never changes. - CGFloat animatedImageDataSize = CGImageGetBytesPerRow(self.posterImage.CGImage) * self.size.height * self.frameCount / MEGABYTE; + CGFloat animatedImageDataSize = CGImageGetBytesPerRow(self.posterImage.CGImage) * self.size.height * (self.frameCount - skippedFrameCount) / MEGABYTE; if (animatedImageDataSize <= FLAnimatedImageDataSizeCategoryAll) { _frameCacheSizeOptimal = self.frameCount; } else if (animatedImageDataSize <= FLAnimatedImageDataSizeCategoryDefault) { @@ -369,13 +366,13 @@ - (UIImage *)imageLazilyCachedAtIndex:(NSUInteger)index // Early return if the requested index is beyond bounds. // Note: We're comparing an index with a count and need to bail on greater than or equal to. if (index >= self.frameCount) { - FLLogWarn(@"Skipping requested frame %lu beyond bounds (total frame count: %lu) for animated image: %@", (unsigned long)index, (unsigned long)self.frameCount, self); + FLLog(FLLogLevelWarn, @"Skipping requested frame %lu beyond bounds (total frame count: %lu) for animated image: %@", (unsigned long)index, (unsigned long)self.frameCount, self); return nil; } // Remember requested frame index, this influences what we should cache next. self.requestedFrameIndex = index; -#if DEBUG +#if defined(DEBUG) && DEBUG if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImage:didRequestCachedFrame:)]) { [self.debug_delegate debug_animatedImage:self didRequestCachedFrame:index]; } @@ -385,7 +382,7 @@ - (UIImage *)imageLazilyCachedAtIndex:(NSUInteger)index if ([self.cachedFrameIndexes count] < self.frameCount) { // If we have frames that should be cached but aren't and aren't requested yet, request them. // Exclude existing cached frames, frames already requested, and specially cached poster image. - NSMutableIndexSet *frameIndexesToAddToCacheMutable = [[self frameIndexesToCache] mutableCopy]; + NSMutableIndexSet *frameIndexesToAddToCacheMutable = [self frameIndexesToCache]; [frameIndexesToAddToCacheMutable removeIndexes:self.cachedFrameIndexes]; [frameIndexesToAddToCacheMutable removeIndexes:self.requestedFrameIndexes]; [frameIndexesToAddToCacheMutable removeIndex:self.posterImageFrameIndex]; @@ -397,12 +394,8 @@ - (UIImage *)imageLazilyCachedAtIndex:(NSUInteger)index } } - // Get the specified image. Watch out for `NSNull` placeholders. - UIImage *image = nil; - id tryImage = self.cachedFrames[index]; - if ([tryImage isKindOfClass:[UIImage class]]) { - image = tryImage; - } + // Get the specified image. + UIImage *image = self.cachedFramesForIndexes[@(index)]; // Purge if needed based on the current playhead position. [self purgeFrameCacheIfNeeded]; @@ -419,7 +412,7 @@ - (void)addFrameIndexesToCache:(NSIndexSet *)frameIndexesToAddToCache NSRange firstRange = NSMakeRange(self.requestedFrameIndex, self.frameCount - self.requestedFrameIndex); NSRange secondRange = NSMakeRange(0, self.requestedFrameIndex); if (firstRange.length + secondRange.length != self.frameCount) { - FLLogWarn(@"Two-part frame cache range doesn't equal full range."); + FLLog(FLLogLevelWarn, @"Two-part frame cache range doesn't equal full range."); } // Add to the requested list before we actually kick them off, so they don't get into the queue twice. @@ -438,11 +431,11 @@ - (void)addFrameIndexesToCache:(NSIndexSet *)frameIndexesToAddToCache void (^frameRangeBlock)(NSRange, BOOL *) = ^(NSRange range, BOOL *stop) { // Iterate through contiguous indexes; can be faster than `enumerateIndexesInRange:options:usingBlock:`. for (NSUInteger i = range.location; i < NSMaxRange(range); i++) { -#if DEBUG +#if defined(DEBUG) && DEBUG CFTimeInterval predrawBeginTime = CACurrentMediaTime(); #endif UIImage *image = [weakSelf predrawnImageAtIndex:i]; -#if DEBUG +#if defined(DEBUG) && DEBUG CFTimeInterval predrawDuration = CACurrentMediaTime() - predrawBeginTime; CFTimeInterval slowdownDuration = 0.0; if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImagePredrawingSlowdownFactor:)]) { @@ -450,16 +443,16 @@ - (void)addFrameIndexesToCache:(NSIndexSet *)frameIndexesToAddToCache slowdownDuration = predrawDuration * predrawingSlowdownFactor - predrawDuration; [NSThread sleepForTimeInterval:slowdownDuration]; } - FLLogVerbose(@"Predrew frame %lu in %f ms for animated image: %@", (unsigned long)i, (predrawDuration + slowdownDuration) * 1000, self); + FLLog(FLLogLevelVerbose, @"Predrew frame %lu in %f ms for animated image: %@", (unsigned long)i, (predrawDuration + slowdownDuration) * 1000, self); #endif // The results get returned one by one as soon as they're ready (and not in batch). // The benefits of having the first frames as quick as possible outweigh building up a buffer to cope with potential hiccups when the CPU suddenly gets busy. if (image && weakSelf) { dispatch_async(dispatch_get_main_queue(), ^{ - weakSelf.cachedFrames[i] = image; + weakSelf.cachedFramesForIndexes[@(i)] = image; [weakSelf.cachedFrameIndexes addIndex:i]; [weakSelf.requestedFrameIndexes removeIndex:i]; -#if DEBUG +#if defined(DEBUG) && DEBUG if ([weakSelf.debug_delegate respondsToSelector:@selector(debug_animatedImage:didUpdateCachedFrames:)]) { [weakSelf.debug_delegate debug_animatedImage:weakSelf didUpdateCachedFrames:weakSelf.cachedFrameIndexes]; } @@ -492,7 +485,7 @@ + (CGSize)sizeForImage:(id)image imageSize = animatedImage.size; } else { // Bear trap to capture bad images; we have seen crashers cropping up on iOS 7. - FLLogError(@"`image` isn't of expected types `UIImage` or `FLAnimatedImage`: %@", image); + FLLog(FLLogLevelError, @"`image` isn't of expected types `UIImage` or `FLAnimatedImage`: %@", image); } return imageSize; @@ -518,33 +511,31 @@ - (UIImage *)predrawnImageAtIndex:(NSUInteger)index #pragma mark Frame Caching -- (NSIndexSet *)frameIndexesToCache +- (NSMutableIndexSet *)frameIndexesToCache { - NSIndexSet *indexesToCache = nil; + NSMutableIndexSet *indexesToCache = nil; // Quick check to avoid building the index set if the number of frames to cache equals the total frame count. if (self.frameCacheSizeCurrent == self.frameCount) { - indexesToCache = self.allFramesIndexSet; + indexesToCache = [self.allFramesIndexSet mutableCopy]; } else { - NSMutableIndexSet *indexesToCacheMutable = [[NSMutableIndexSet alloc] init]; + indexesToCache = [[NSMutableIndexSet alloc] init]; // Add indexes to the set in two separate blocks- the first starting from the requested frame index, up to the limit or the end. // The second, if needed, the remaining number of frames beginning at index zero. NSUInteger firstLength = MIN(self.frameCacheSizeCurrent, self.frameCount - self.requestedFrameIndex); NSRange firstRange = NSMakeRange(self.requestedFrameIndex, firstLength); - [indexesToCacheMutable addIndexesInRange:firstRange]; + [indexesToCache addIndexesInRange:firstRange]; NSUInteger secondLength = self.frameCacheSizeCurrent - firstLength; if (secondLength > 0) { NSRange secondRange = NSMakeRange(0, secondLength); - [indexesToCacheMutable addIndexesInRange:secondRange]; + [indexesToCache addIndexesInRange:secondRange]; } // Double check our math, before we add the poster image index which may increase it by one. - if ([indexesToCacheMutable count] != self.frameCacheSizeCurrent) { - FLLogWarn(@"Number of frames to cache doesn't equal expected cache size."); + if ([indexesToCache count] != self.frameCacheSizeCurrent) { + FLLog(FLLogLevelWarn, @"Number of frames to cache doesn't equal expected cache size."); } - [indexesToCacheMutable addIndex:self.posterImageFrameIndex]; - - indexesToCache = [indexesToCacheMutable copy]; + [indexesToCache addIndex:self.posterImageFrameIndex]; } return indexesToCache; @@ -563,9 +554,9 @@ - (void)purgeFrameCacheIfNeeded // Iterate through contiguous indexes; can be faster than `enumerateIndexesInRange:options:usingBlock:`. for (NSUInteger i = range.location; i < NSMaxRange(range); i++) { [self.cachedFrameIndexes removeIndex:i]; - self.cachedFrames[i] = [NSNull null]; + [self.cachedFramesForIndexes removeObjectForKey:@(i)]; // Note: Don't `CGImageSourceRemoveCacheAtIndex` on the image source for frames that we don't want cached any longer to maintain O(1) time access. -#if DEBUG +#if defined(DEBUG) && DEBUG if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImage:didUpdateCachedFrames:)]) { dispatch_async(dispatch_get_main_queue(), ^{ [self.debug_delegate debug_animatedImage:self didUpdateCachedFrames:self.cachedFrameIndexes]; @@ -581,7 +572,7 @@ - (void)purgeFrameCacheIfNeeded - (void)growFrameCacheSizeAfterMemoryWarning:(NSNumber *)frameCacheSize { self.frameCacheSizeMaxInternal = [frameCacheSize unsignedIntegerValue]; - FLLogDebug(@"Grew frame cache size max to %lu after memory warning for animated image: %@", (unsigned long)self.frameCacheSizeMaxInternal, self); + FLLog(FLLogLevelDebug, @"Grew frame cache size max to %lu after memory warning for animated image: %@", (unsigned long)self.frameCacheSizeMaxInternal, self); // Schedule resetting the frame cache size max completely after a while. const NSTimeInterval kResetDelay = 3.0; @@ -592,7 +583,7 @@ - (void)growFrameCacheSizeAfterMemoryWarning:(NSNumber *)frameCacheSize - (void)resetFrameCacheSizeMaxInternal { self.frameCacheSizeMaxInternal = FLAnimatedImageFrameCacheSizeNoLimit; - FLLogDebug(@"Reset frame cache size max (current frame cache size: %lu) for animated image: %@", (unsigned long)self.frameCacheSizeCurrent, self); + FLLog(FLLogLevelDebug, @"Reset frame cache size max (current frame cache size: %lu) for animated image: %@", (unsigned long)self.frameCacheSizeCurrent, self); } @@ -607,7 +598,7 @@ - (void)didReceiveMemoryWarning:(NSNotification *)notification [NSObject cancelPreviousPerformRequestsWithTarget:self.weakProxy selector:@selector(resetFrameCacheSizeMaxInternal) object:nil]; // Go down to the minimum and by that implicitly immediately purge from the cache if needed to not get jettisoned by the system and start producing frames on-demand. - FLLogDebug(@"Attempt setting frame cache size max to %lu (previous was %lu) after memory warning #%lu for animated image: %@", (unsigned long)FLAnimatedImageFrameCacheSizeLowMemory, (unsigned long)self.frameCacheSizeMaxInternal, (unsigned long)self.memoryWarningCount, self); + FLLog(FLLogLevelDebug, @"Attempt setting frame cache size max to %lu (previous was %lu) after memory warning #%lu for animated image: %@", (unsigned long)FLAnimatedImageFrameCacheSizeLowMemory, (unsigned long)self.frameCacheSizeMaxInternal, (unsigned long)self.memoryWarningCount, self); self.frameCacheSizeMaxInternal = FLAnimatedImageFrameCacheSizeLowMemory; // Schedule growing larger again after a while, but cap our attempts to prevent a periodic sawtooth wave (ramps upward and then sharply drops) of memory usage. @@ -644,7 +635,7 @@ + (UIImage *)predrawnImageFromImage:(UIImage *)imageToPredraw CGColorSpaceRef colorSpaceDeviceRGBRef = CGColorSpaceCreateDeviceRGB(); // Early return on failure! if (!colorSpaceDeviceRGBRef) { - FLLogError(@"Failed to `CGColorSpaceCreateDeviceRGB` for image %@", imageToPredraw); + FLLog(FLLogLevelError, @"Failed to `CGColorSpaceCreateDeviceRGB` for image %@", imageToPredraw); return imageToPredraw; } @@ -684,7 +675,7 @@ + (UIImage *)predrawnImageFromImage:(UIImage *)imageToPredraw CGColorSpaceRelease(colorSpaceDeviceRGBRef); // Early return on failure! if (!bitmapContextRef) { - FLLogError(@"Failed to `CGBitmapContextCreate` with color space %@ and parameters (width: %zu height: %zu bitsPerComponent: %zu bytesPerRow: %zu) for image %@", colorSpaceDeviceRGBRef, width, height, bitsPerComponent, bytesPerRow, imageToPredraw); + FLLog(FLLogLevelError, @"Failed to `CGBitmapContextCreate` with color space %@ and parameters (width: %zu height: %zu bitsPerComponent: %zu bytesPerRow: %zu) for image %@", colorSpaceDeviceRGBRef, width, height, bitsPerComponent, bytesPerRow, imageToPredraw); return imageToPredraw; } @@ -697,7 +688,7 @@ + (UIImage *)predrawnImageFromImage:(UIImage *)imageToPredraw // Early return on failure! if (!predrawnImage) { - FLLogError(@"Failed to `imageWithCGImage:scale:orientation:` with image ref %@ created with color space %@ and bitmap context %@ and properties and properties (scale: %f orientation: %ld) for image %@", predrawnImageRef, colorSpaceDeviceRGBRef, bitmapContextRef, imageToPredraw.scale, (long)imageToPredraw.imageOrientation, imageToPredraw); + FLLog(FLLogLevelError, @"Failed to `imageWithCGImage:scale:orientation:` with image ref %@ created with color space %@ and bitmap context %@ and properties and properties (scale: %f orientation: %ld) for image %@", predrawnImageRef, colorSpaceDeviceRGBRef, bitmapContextRef, imageToPredraw.scale, (long)imageToPredraw.imageOrientation, imageToPredraw); return imageToPredraw; } @@ -718,6 +709,28 @@ - (NSString *)description } +@end + +#pragma mark - Logging + +@implementation FLAnimatedImage (Logging) + +static void (^_logBlock)(NSString *logString, FLLogLevel logLevel) = nil; +static FLLogLevel _logLevel; + ++ (void)setLogBlock:(void (^)(NSString *logString, FLLogLevel logLevel))logBlock logLevel:(FLLogLevel)logLevel +{ + _logBlock = logBlock; + _logLevel = logLevel; +} + ++ (void)logStringFromBlock:(NSString *(^)(void))stringBlock withLevel:(FLLogLevel)level +{ + if (level <= _logLevel && _logBlock && stringBlock) { + _logBlock(stringBlock(), level); + } +} + @end diff --git a/Example/Pods/FLAnimatedImage/FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImageView.h b/Example/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h similarity index 72% rename from Example/Pods/FLAnimatedImage/FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImageView.h rename to Example/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h index fbb41035..e7100433 100644 --- a/Example/Pods/FLAnimatedImage/FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImageView.h +++ b/Example/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h @@ -3,7 +3,7 @@ // Flipboard // // Created by Raphael Schaad on 7/8/13. -// Copyright (c) 2013-2014 Flipboard. All rights reserved. +// Copyright (c) 2013-2015 Flipboard. All rights reserved. // @@ -24,24 +24,9 @@ // Setting `[UIImageView.image]` to a non-`nil` value clears out existing `animatedImage`. // And vice versa, setting `animatedImage` will initially populate the `[UIImageView.image]` to its `posterImage` and then start animating and hold `currentFrame`. @property (nonatomic, strong) FLAnimatedImage *animatedImage; +@property (nonatomic, copy) void(^loopCompletionBlock)(NSUInteger loopCountRemaining); @property (nonatomic, strong, readonly) UIImage *currentFrame; @property (nonatomic, assign, readonly) NSUInteger currentFrameIndex; -#if DEBUG -// Only intended to report internal state for debugging -@property (nonatomic, weak) id debug_delegate; -#endif - -@end - - -#if DEBUG -@protocol FLAnimatedImageViewDebugDelegate - -@optional - -- (void)debug_animatedImageView:(FLAnimatedImageView *)animatedImageView waitingForFrame:(NSUInteger)index duration:(NSTimeInterval)duration; - @end -#endif diff --git a/Example/Pods/FLAnimatedImage/FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImageView.m b/Example/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m old mode 100644 new mode 100755 similarity index 56% rename from Example/Pods/FLAnimatedImage/FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImageView.m rename to Example/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m index 73336b5a..99f398a6 --- a/Example/Pods/FLAnimatedImage/FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImageView.m +++ b/Example/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m @@ -3,7 +3,7 @@ // Flipboard // // Created by Raphael Schaad on 7/8/13. -// Copyright (c) 2013-2014 Flipboard. All rights reserved. +// Copyright (c) 2013-2015 Flipboard. All rights reserved. // @@ -12,6 +12,14 @@ #import +#if defined(DEBUG) && DEBUG +@protocol FLAnimatedImageViewDebugDelegate +@optional +- (void)debug_animatedImageView:(FLAnimatedImageView *)animatedImageView waitingForFrame:(NSUInteger)index duration:(NSTimeInterval)duration; +@end +#endif + + @interface FLAnimatedImageView () // Override of public `readonly` properties as private `readwrite` @@ -22,9 +30,13 @@ @interface FLAnimatedImageView () @property (nonatomic, assign) NSTimeInterval accumulator; @property (nonatomic, strong) CADisplayLink *displayLink; -@property (nonatomic, assign) BOOL shouldAnimate; // Before checking this value, call `-updateShouldAnimate` whenever the animated image, window or superview has changed. +@property (nonatomic, assign) BOOL shouldAnimate; // Before checking this value, call `-updateShouldAnimate` whenever the animated image or visibility (window, superview, hidden, alpha) has changed. @property (nonatomic, assign) BOOL needsDisplayWhenImageBecomesAvailable; +#if defined(DEBUG) && DEBUG +@property (nonatomic, weak) id debug_delegate; +#endif + @end @@ -107,6 +119,30 @@ - (void)didMoveToWindow } } +- (void)setAlpha:(CGFloat)alpha +{ + [super setAlpha:alpha]; + + [self updateShouldAnimate]; + if (self.shouldAnimate) { + [self startAnimating]; + } else { + [self stopAnimating]; + } +} + +- (void)setHidden:(BOOL)hidden +{ + [super setHidden:hidden]; + + [self updateShouldAnimate]; + if (self.shouldAnimate) { + [self startAnimating]; + } else { + [self stopAnimating]; + } +} + #pragma mark Auto Layout @@ -155,6 +191,45 @@ - (void)setImage:(UIImage *)image #pragma mark Animating Images +- (NSTimeInterval)frameDelayGreatestCommonDivisor +{ + // Presision is set to half of the `kFLAnimatedImageDelayTimeIntervalMinimum` in order to minimize frame dropping. + const NSTimeInterval kGreatestCommonDivisorPrecision = 2.0 / kFLAnimatedImageDelayTimeIntervalMinimum; + + NSArray *delays = self.animatedImage.delayTimesForIndexes.allValues; + + // Scales the frame delays by `kGreatestCommonDivisorPrecision` + // then converts it to an UInteger for in order to calculate the GCD. + NSUInteger scaledGCD = lrint([delays.firstObject floatValue] * kGreatestCommonDivisorPrecision); + for (NSNumber *value in delays) { + scaledGCD = gcd(lrint([value floatValue] * kGreatestCommonDivisorPrecision), scaledGCD); + } + + // Reverse to scale to get the value back into seconds. + return scaledGCD / kGreatestCommonDivisorPrecision; +} + + +static NSUInteger gcd(NSUInteger a, NSUInteger b) +{ + // http://en.wikipedia.org/wiki/Greatest_common_divisor + if (a < b) { + return gcd(b, a); + } else if (a == b) { + return b; + } + + while (true) { + NSUInteger remainder = a % b; + if (remainder == 0) { + return b; + } + a = b; + b = remainder; + } +} + + - (void)startAnimating { if (self.animatedImage) { @@ -176,10 +251,13 @@ - (void)startAnimating mode = NSRunLoopCommonModes; } [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:mode]; - - // Note: The display link's `.frameInterval` value of 1 (default) means getting callbacks at the refresh rate of the display (~60Hz). - // Setting it to 2 divides the frame rate by 2 and hence calls back at every other frame. } + + // Note: The display link's `.frameInterval` value of 1 (default) means getting callbacks at the refresh rate of the display (~60Hz). + // Setting it to 2 divides the frame rate by 2 and hence calls back at every other display refresh. + const NSTimeInterval kDisplayRefreshRate = 60.0; // 60Hz + self.displayLink.frameInterval = MAX([self frameDelayGreatestCommonDivisor] * kDisplayRefreshRate, 1); + self.displayLink.paused = NO; } else { [super startAnimating]; @@ -224,10 +302,11 @@ - (void)setHighlighted:(BOOL)highlighted #pragma mark Animation // Don't repeatedly check our window & superview in `-displayDidRefresh:` for performance reasons. -// Just update our cached value whenever the animated image, window or superview is changed. +// Just update our cached value whenever the animated image or visibility (window, superview, hidden, alpha) is changed. - (void)updateShouldAnimate { - self.shouldAnimate = self.animatedImage && self.window && self.superview; + BOOL isVisible = self.window && self.superview && ![self isHidden] && self.alpha > 0.0; + self.shouldAnimate = self.animatedImage && isVisible; } @@ -236,46 +315,57 @@ - (void)displayDidRefresh:(CADisplayLink *)displayLink // If for some reason a wild call makes it through when we shouldn't be animating, bail. // Early return! if (!self.shouldAnimate) { - FLLogWarn(@"Trying to animate image when we shouldn't: %@", self); + FLLog(FLLogLevelWarn, @"Trying to animate image when we shouldn't: %@", self); return; } - // If we have a nil image, don't update the view nor playhead. - UIImage *image = [self.animatedImage imageLazilyCachedAtIndex:self.currentFrameIndex]; - if (image) { - FLLogVerbose(@"Showing frame %lu for animated image: %@", (unsigned long)self.currentFrameIndex, self.animatedImage); - self.currentFrame = image; - if (self.needsDisplayWhenImageBecomesAvailable) { - [self.layer setNeedsDisplay]; - self.needsDisplayWhenImageBecomesAvailable = NO; - } - - self.accumulator += displayLink.duration; - - // While-loop first inspired by & good Karma to: https://github.com/ondalabs/OLImageView/blob/master/OLImageView.m - while (self.accumulator >= [self.animatedImage.delayTimes[self.currentFrameIndex] floatValue]) { - self.accumulator -= [self.animatedImage.delayTimes[self.currentFrameIndex] floatValue]; - self.currentFrameIndex++; - if (self.currentFrameIndex >= self.animatedImage.frameCount) { - // If we've looped the number of times that this animated image describes, stop looping. - self.loopCountdown--; - if (self.loopCountdown == 0) { - [self stopAnimating]; - return; + NSNumber *delayTimeNumber = [self.animatedImage.delayTimesForIndexes objectForKey:@(self.currentFrameIndex)]; + // If we don't have a frame delay (e.g. corrupt frame), don't update the view but skip the playhead to the next frame (in else-block). + if (delayTimeNumber) { + NSTimeInterval delayTime = [delayTimeNumber floatValue]; + // If we have a nil image (e.g. waiting for frame), don't update the view nor playhead. + UIImage *image = [self.animatedImage imageLazilyCachedAtIndex:self.currentFrameIndex]; + if (image) { + FLLog(FLLogLevelVerbose, @"Showing frame %lu for animated image: %@", (unsigned long)self.currentFrameIndex, self.animatedImage); + self.currentFrame = image; + if (self.needsDisplayWhenImageBecomesAvailable) { + [self.layer setNeedsDisplay]; + self.needsDisplayWhenImageBecomesAvailable = NO; + } + + self.accumulator += displayLink.duration * displayLink.frameInterval; + + // While-loop first inspired by & good Karma to: https://github.com/ondalabs/OLImageView/blob/master/OLImageView.m + while (self.accumulator >= delayTime) { + self.accumulator -= delayTime; + self.currentFrameIndex++; + if (self.currentFrameIndex >= self.animatedImage.frameCount) { + // If we've looped the number of times that this animated image describes, stop looping. + self.loopCountdown--; + if (self.loopCompletionBlock) { + self.loopCompletionBlock(self.loopCountdown); + } + + if (self.loopCountdown == 0) { + [self stopAnimating]; + return; + } + self.currentFrameIndex = 0; } - self.currentFrameIndex = 0; + // Calling `-setNeedsDisplay` will just paint the current frame, not the new frame that we may have moved to. + // Instead, set `needsDisplayWhenImageBecomesAvailable` to `YES` -- this will paint the new image once loaded. + self.needsDisplayWhenImageBecomesAvailable = YES; + } + } else { + FLLog(FLLogLevelDebug, @"Waiting for frame %lu for animated image: %@", (unsigned long)self.currentFrameIndex, self.animatedImage); +#if defined(DEBUG) && DEBUG + if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImageView:waitingForFrame:duration:)]) { + [self.debug_delegate debug_animatedImageView:self waitingForFrame:self.currentFrameIndex duration:(NSTimeInterval)displayLink.duration * displayLink.frameInterval]; } - // Calling `-setNeedsDisplay` will just paint the current frame, not the new frame that we may have moved to. - // Instead, set `needsDisplayWhenImageBecomesAvailable` to `YES` -- this will paint the new image once loaded. - self.needsDisplayWhenImageBecomesAvailable = YES; +#endif } } else { - FLLogDebug(@"Waiting for frame %lu for animated image: %@", (unsigned long)self.currentFrameIndex, self.animatedImage); -#if DEBUG - if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImageView:waitingForFrame:duration:)]) { - [self.debug_delegate debug_animatedImageView:self waitingForFrame:self.currentFrameIndex duration:(NSTimeInterval)self.displayLink.duration]; - } -#endif + self.currentFrameIndex++; } } diff --git a/Example/Pods/FLAnimatedImage/FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImage.h b/Example/Pods/FLAnimatedImage/FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImage.h deleted file mode 100644 index dc4358cc..00000000 --- a/Example/Pods/FLAnimatedImage/FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImage.h +++ /dev/null @@ -1,156 +0,0 @@ -// -// FLAnimatedImage.h -// Flipboard -// -// Created by Raphael Schaad on 7/8/13. -// Copyright (c) 2013-2014 Flipboard. All rights reserved. -// - - -#import - -// Allow user classes conveniently just importing one header. -#import "FLAnimatedImageView.h" - -#if DEBUG -@protocol FLAnimatedImageDebugDelegate; -#endif - - -// Logging -// If set to 0, disables integration with CocoaLumberjack Logger (only matters if CocoaLumberjack is installed). -#ifndef FLLumberjackIntegrationEnabled - #define FLLumberjackIntegrationEnabled 1 -#endif - -// If set to 1, enables NSLog logging (only matters #if DEBUG -- never for release builds). -#ifndef FLDebugLoggingEnabled - #define FLDebugLoggingEnabled 0 -#endif - - -#ifndef NS_DESIGNATED_INITIALIZER - #if __has_attribute(objc_designated_initializer) - #define NS_DESIGNATED_INITIALIZER __attribute((objc_designated_initializer)) - #else - #define NS_DESIGNATED_INITIALIZER - #endif -#endif - - -// -// An `FLAnimatedImage`'s job is to deliver frames in a highly performant way and works in conjunction with `FLAnimatedImageView`. -// It subclasses `NSObject` and not `UIImage` because it's only an "image" in the sense that a sea lion is a lion. -// It tries to intelligently choose the frame cache size depending on the image and memory situation with the goal to lower CPU usage for smaller ones, lower memory usage for larger ones and always deliver frames for high performant play-back. -// Note: `posterImage`, `size`, `loopCount`, `delayTimes` and `frameCount` don't change after successful initialization. -// -@interface FLAnimatedImage : NSObject - -@property (nonatomic, strong, readonly) UIImage *posterImage; // Guaranteed to be loaded; usually equivalent to `-imageLazilyCachedAtIndex:0` -@property (nonatomic, assign, readonly) CGSize size; // The `.posterImage`'s `.size` - -@property (nonatomic, assign, readonly) NSUInteger loopCount; // 0 means repeating the animation indefinitely -@property (nonatomic, strong, readonly) NSArray *delayTimes; // Of type `NSTimeInterval` boxed in `NSNumber`s -@property (nonatomic, assign, readonly) NSUInteger frameCount; // Number of valid frames; equal to `[.delayTimes count]` - -@property (nonatomic, assign, readonly) NSUInteger frameCacheSizeCurrent; // Current size of intelligently chosen buffer window; can range in the interval [1..frameCount] -@property (nonatomic, assign) NSUInteger frameCacheSizeMax; // Allow to cap the cache size; 0 means no specific limit (default) - -// Intended to be called from main thread synchronously; will return immediately. -// If the result isn't cached, will return `nil`; the caller should then pause playback, not increment frame counter and keep polling. -// After an initial loading time, depending on `frameCacheSize`, frames should be available immediately from the cache. -- (UIImage *)imageLazilyCachedAtIndex:(NSUInteger)index; - -// Pass either a `UIImage` or an `FLAnimatedImage` and get back its size -+ (CGSize)sizeForImage:(id)image; - -// On success, the initializers return an `FLAnimatedImage` with all fields initialized, on failure they return `nil` and an error will be logged. -- (instancetype)initWithAnimatedGIFData:(NSData *)data NS_DESIGNATED_INITIALIZER; -+ (instancetype)animatedImageWithGIFData:(NSData *)data; - -@property (nonatomic, strong, readonly) NSData *data; // The data the receiver was initialized with; read-only - -#if DEBUG -// Only intended to report internal state for debugging -@property (nonatomic, weak) id debug_delegate; -@property (nonatomic, strong) NSMutableDictionary *debug_info; // To track arbitrary data (e.g. original URL, loading durations, cache hits, etc.) -#endif - -@end - - -@interface FLWeakProxy : NSProxy - -+ (instancetype)weakProxyForObject:(id)targetObject; - -@end - - -#if DEBUG -@protocol FLAnimatedImageDebugDelegate - -@optional - -- (void)debug_animatedImage:(FLAnimatedImage *)animatedImage didUpdateCachedFrames:(NSIndexSet *)indexesOfFramesInCache; -- (void)debug_animatedImage:(FLAnimatedImage *)animatedImage didRequestCachedFrame:(NSUInteger)index; -- (CGFloat)debug_animatedImagePredrawingSlowdownFactor:(FLAnimatedImage *)animatedImage; - -@end -#endif - - -// Try to detect and import CocoaLumberjack in all scenarious (library versions, way of including it, CocoaPods versions, etc.). -#if FLLumberjackIntegrationEnabled - #if defined(__has_include) - #if __has_include("") - #import - #elif __has_include("CocoaLumberjack.h") - #import "CocoaLumberjack.h" - #elif __has_include("") - #import - #elif __has_include("DDLog.h") - #import "DDLog.h" - #endif - #elif defined(COCOAPODS_POD_AVAILABLE_CocoaLumberjack) || defined(__POD_CocoaLumberjack) - #if COCOAPODS_VERSION_MAJOR_CocoaLumberjack == 2 - #import - #else - #import - #endif - #endif - - #if defined(DDLogError) && defined(DDLogWarn) && defined(DDLogInfo) && defined(DDLogDebug) && defined(DDLogVerbose) - #define FLLumberjackAvailable - #endif -#endif - -#if FLLumberjackIntegrationEnabled && defined(FLLumberjackAvailable) - // Use a custom, global (not per-file) log level for this library. - extern int flAnimatedImageLogLevel; - #if defined(LOG_OBJC_MAYBE) // CocoaLumberjack 1.x - #define FLLogError(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_ERROR, flAnimatedImageLogLevel, LOG_FLAG_ERROR, 0, frmt, ##__VA_ARGS__) - #define FLLogWarn(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_WARN, flAnimatedImageLogLevel, LOG_FLAG_WARN, 0, frmt, ##__VA_ARGS__) - #define FLLogInfo(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_INFO, flAnimatedImageLogLevel, LOG_FLAG_INFO, 0, frmt, ##__VA_ARGS__) - #define FLLogDebug(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_DEBUG, flAnimatedImageLogLevel, LOG_FLAG_DEBUG, 0, frmt, ##__VA_ARGS__) - #define FLLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, flAnimatedImageLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__) - #else // CocoaLumberjack 2.x - #define FLLogError(frmt, ...) LOG_MAYBE(NO, flAnimatedImageLogLevel, DDLogFlagError, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__) - #define FLLogWarn(frmt, ...) LOG_MAYBE(LOG_ASYNC_ENABLED, flAnimatedImageLogLevel, DDLogFlagWarning, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__) - #define FLLogInfo(frmt, ...) LOG_MAYBE(LOG_ASYNC_ENABLED, flAnimatedImageLogLevel, DDLogFlagInfo, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__) - #define FLLogDebug(frmt, ...) LOG_MAYBE(LOG_ASYNC_ENABLED, flAnimatedImageLogLevel, DDLogFlagDebug, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__) - #define FLLogVerbose(frmt, ...) LOG_MAYBE(LOG_ASYNC_ENABLED, flAnimatedImageLogLevel, DDLogFlagVerbose, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__) - #endif -#else - #if FLDebugLoggingEnabled && DEBUG - // CocoaLumberjack is disabled or not available, but we want to fallback to regular logging (debug builds only). - #define FLLog(...) NSLog(__VA_ARGS__) - #else - // No logging at all. - #define FLLog(...) ((void)0) - #endif - #define FLLogError(...) FLLog(__VA_ARGS__) - #define FLLogWarn(...) FLLog(__VA_ARGS__) - #define FLLogInfo(...) FLLog(__VA_ARGS__) - #define FLLogDebug(...) FLLog(__VA_ARGS__) - #define FLLogVerbose(...) FLLog(__VA_ARGS__) -#endif diff --git a/Example/Pods/FLAnimatedImage/LICENSE b/Example/Pods/FLAnimatedImage/LICENSE index 7e37ba0b..89fa0930 100644 --- a/Example/Pods/FLAnimatedImage/LICENSE +++ b/Example/Pods/FLAnimatedImage/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014 Flipboard +Copyright (c) 2014-2015 Flipboard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. diff --git a/Example/Pods/FLAnimatedImage/README.md b/Example/Pods/FLAnimatedImage/README.md index cd72e7d8..59144f2d 100644 --- a/Example/Pods/FLAnimatedImage/README.md +++ b/Example/Pods/FLAnimatedImage/README.md @@ -32,6 +32,12 @@ To add it to your app, copy the two classes `FLAnimatedImage.h/.m` and `FLAnimat pod 'FLAnimatedImage', '~> 1.0' ``` +If using [Carthage](https://github.com/Carthage/Carthage), add following line into your `Cartfile` + +``` +github "Flipboard/FLAnimatedImage" +``` + In your code, `#import "FLAnimatedImage.h"`, create an image from an animated GIF, and setup the image view to display it: ```objective-c @@ -46,7 +52,22 @@ It's flexible to integrate in your custom image loading stack and backwards comp It uses ARC and the Apple frameworks `QuartzCore`, `ImageIO`, `MobileCoreServices`, and `CoreGraphics`. -It has fine-grained logging. By default, it uses NSLog. However, if your project uses [CocoaLumberjack](https://github.com/CocoaLumberjack/CocoaLumberjack), it automatically can detect that and use CocoaLumberjack to send logs to the configured output. +It is capable of fine-grained logging. A block can be set on `FLAnimatedImage` that's invoked when logging occurs with various log levels via the `+setLogBlock:logLevel:` method. For example: + +```objective-c +// Set up FLAnimatedImage logging. +[FLAnimatedImage setLogBlock:^(NSString *logString, FLLogLevel logLevel) { + // Using NSLog + NSLog(@"%@", logString); + + // ...or CocoaLumberjackLogger only logging warnings and errors + if (logLevel == FLLogLevelError) { + DDLogError(@"%@", logString); + } else if (logLevel == FLLogLevelWarn) { + DDLogWarn(@"%@", logString); + } +} logLevel:FLLogLevelWarn]; +``` Since FLAnimatedImage is licensed under MIT, it's compatible with the terms of using it for any app on the App Store. @@ -55,18 +76,26 @@ Since FLAnimatedImage is licensed under MIT, it's compatible with the terms of u - Integration into network libraries and image caches - Investigate whether `FLAnimatedImage` should become a `UIImage` subclass - Smarter buffering -- Bring demo app to iOS 6 and iPhone +- Bring demo app to iPhone This has successfully shipped to many people as is, but please do come with your questions, issues and pull requests! Feel free to reach out to [@RaphaelSchaad](https://twitter.com/raphaelschaad) for further help. -## Apps using FLAnimatedImage +## Select apps using FLAnimatedImage - [Dropbox](https://www.dropbox.com) - [Medium](https://medium.com) +- [Facebook](https://facebook.com) +- [Pinterest](https://pinterest.com) - [LiveBooth](http://www.liveboothapp.com) -- [Design Shots](https://itunes.apple.com/us/app/design-shots-dribbble-client/id792517951) +- [Design Shots](https://itunes.apple.com/app/id792517951) - [lWlVl Festival](http://lwlvl.com) +- [Close-up](http://closeu.pe) +- [Zip Code Finder](https://itunes.apple.com/app/id893031254) +- [getGIF](https://itunes.apple.com/app/id964784701) +- [Giffage](http://giffage.com) - [Flipboard](https://flipboard.com) +- [Gifalicious](https://itunes.apple.com/us/app/gifalicious-see-your-gifs/id965346708?mt=8) +- [Slack](https://slack.com/) Using FLAnimatedImage in your app? [Let me know!](https://twitter.com/raphaelschaad) diff --git a/Example/Pods/Headers/Private/FLAnimatedImage/FLAnimatedImage.h b/Example/Pods/Headers/Private/FLAnimatedImage/FLAnimatedImage.h index baffaddc..6b3118af 120000 --- a/Example/Pods/Headers/Private/FLAnimatedImage/FLAnimatedImage.h +++ b/Example/Pods/Headers/Private/FLAnimatedImage/FLAnimatedImage.h @@ -1 +1 @@ -../../../FLAnimatedImage/FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImage.h \ No newline at end of file +../../../FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/FLAnimatedImage/FLAnimatedImageView.h b/Example/Pods/Headers/Private/FLAnimatedImage/FLAnimatedImageView.h index c7188bb5..8d98a7bc 120000 --- a/Example/Pods/Headers/Private/FLAnimatedImage/FLAnimatedImageView.h +++ b/Example/Pods/Headers/Private/FLAnimatedImage/FLAnimatedImageView.h @@ -1 +1 @@ -../../../FLAnimatedImage/FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImageView.h \ No newline at end of file +../../../FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoCaptionViewLayoutWidthHinting.h b/Example/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoCaptionViewLayoutWidthHinting.h new file mode 120000 index 00000000..7a548d4e --- /dev/null +++ b/Example/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoCaptionViewLayoutWidthHinting.h @@ -0,0 +1 @@ +../../../../../Pod/Classes/ios/Protocols/NYTPhotoCaptionViewLayoutWidthHinting.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/FLAnimatedImage/FLAnimatedImage.h b/Example/Pods/Headers/Public/FLAnimatedImage/FLAnimatedImage.h index baffaddc..6b3118af 120000 --- a/Example/Pods/Headers/Public/FLAnimatedImage/FLAnimatedImage.h +++ b/Example/Pods/Headers/Public/FLAnimatedImage/FLAnimatedImage.h @@ -1 +1 @@ -../../../FLAnimatedImage/FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImage.h \ No newline at end of file +../../../FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/FLAnimatedImage/FLAnimatedImageView.h b/Example/Pods/Headers/Public/FLAnimatedImage/FLAnimatedImageView.h index c7188bb5..8d98a7bc 120000 --- a/Example/Pods/Headers/Public/FLAnimatedImage/FLAnimatedImageView.h +++ b/Example/Pods/Headers/Public/FLAnimatedImage/FLAnimatedImageView.h @@ -1 +1 @@ -../../../FLAnimatedImage/FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImageView.h \ No newline at end of file +../../../FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoCaptionViewLayoutWidthHinting.h b/Example/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoCaptionViewLayoutWidthHinting.h new file mode 120000 index 00000000..7a548d4e --- /dev/null +++ b/Example/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoCaptionViewLayoutWidthHinting.h @@ -0,0 +1 @@ +../../../../../Pod/Classes/ios/Protocols/NYTPhotoCaptionViewLayoutWidthHinting.h \ No newline at end of file diff --git a/Example/Pods/Local Podspecs/NYTPhotoViewer.podspec.json b/Example/Pods/Local Podspecs/NYTPhotoViewer.podspec.json index ce5fdf04..b4fecb3f 100644 --- a/Example/Pods/Local Podspecs/NYTPhotoViewer.podspec.json +++ b/Example/Pods/Local Podspecs/NYTPhotoViewer.podspec.json @@ -42,7 +42,7 @@ ], "FLAnimatedImage": [ - "1.0.8" + "~> 1.0.8" ] } } diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock index aaf6af69..ba4882f1 100644 --- a/Example/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -1,7 +1,7 @@ PODS: - - FLAnimatedImage (1.0.8) + - FLAnimatedImage (1.0.10) - NYTPhotoViewer/AnimatedGifSupport (0.1.2): - - FLAnimatedImage (= 1.0.8) + - FLAnimatedImage (~> 1.0.8) - NYTPhotoViewer/Core - NYTPhotoViewer/Core (0.1.2) - OCMock (3.2) @@ -15,8 +15,8 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - FLAnimatedImage: f9422f796135aff80d8c00b2afc48015bb746e24 - NYTPhotoViewer: e348bfa437398deb67a88b7928e85168ac38b5df + FLAnimatedImage: e16a1e1cef08e4c509b47e4acbe3923f65c16135 + NYTPhotoViewer: 06876beb4c9bc6f10a59eb8b898c480fd89f7c51 OCMock: 28def049ef47f996b515a8eeea958be7ccab2dbb COCOAPODS: 0.39.0 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 26fcc4ed..0323a8a2 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -9,134 +9,128 @@ /* Begin PBXBuildFile section */ 03EF931564978791D4ABC400F3FDDBED /* OCMVerifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D1F8DFB3B198B389EEB6275D77F16BE /* OCMVerifier.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 046937EA1C4859D4D96EFA7B7687E441 /* OCMBlockCaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C9A797A2497538C323AFD99D88A2729 /* OCMBlockCaller.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 04AF9593455148EB5B9A43882B8BDBDA /* NYTPhotosViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F1AF8DD08D62A5BDD9BC5313F8DE607 /* NYTPhotosViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 062258F0A1BD8AB11E3E3B1815357988 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22CC099EDADB76C55367796DBD37AE8D /* QuartzCore.framework */; }; - 06B521E7788C0D7EEEE5442C70DC4C6D /* NYTPhotoCaptionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 0CEC2EB950AAEA9853DC4BE18841D0E5 /* NYTPhotoCaptionView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0934D3DAC27331C1569A357A677B2206 /* NSMethodSignature+OCMAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = A9D76DC181FFA24CA772C83CC5998F99 /* NSMethodSignature+OCMAdditions.h */; settings = {ATTRIBUTES = (Project, ); }; }; 0A7C4089DBD8BD40374AFA8EEAB7CA3C /* OCMPassByRefSetter.m in Sources */ = {isa = PBXBuildFile; fileRef = D30281F94F4C6A8CADB1829C32CBE143 /* OCMPassByRefSetter.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 0D9F93D0B730EA7DB676F474C1611FC6 /* NYTScalingImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C1BD56355078ED0311DA2E365268202 /* NYTScalingImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0DECD374B59611D4E32BD5EF406679F1 /* NYTPhotoViewerCloseButtonX@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 98899FA2A9FDC7C35C5BDB88F86A11CB /* NYTPhotoViewerCloseButtonX@3x.png */; }; 0EE98780873CB1A29EE8B4A36BA7E14A /* OCMFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B9C2EF14DDBCDD41F6D3A9D98ABAE82 /* OCMFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0EFCE23D81397A312044D44B2DEF5E98 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBC85ECBD828DF92AC9EEB8B18DA6F1 /* Foundation.framework */; }; 10AEAD2136880EEE7E771F533331F250 /* OCMock.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B368F633457B0DB0830B17B921F8C1C /* OCMock.h */; settings = {ATTRIBUTES = (Public, ); }; }; 149DE9C6DB74B12EFF07D185484D946F /* NSInvocation+OCMAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 814AEB5E1354012135422C0913AE8797 /* NSInvocation+OCMAdditions.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 14EA64C0FC85C40F7CC6B35835F44F60 /* NYTPhotoViewerCloseButtonXLandscape@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = B271D7914F3BBE18B22AB38342AF3803 /* NYTPhotoViewerCloseButtonXLandscape@3x.png */; }; 1586CD3BDB1E92D87A0E423AAC313FD4 /* OCMObserverRecorder.m in Sources */ = {isa = PBXBuildFile; fileRef = DDA5DD2854CFED7FF011EE6A9A4DCB4D /* OCMObserverRecorder.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 159381411E3F55FD8055347BDCF1E0BD /* NYTPhotoViewerCloseButtonX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 84BCB2FD814B25FC5DF03FD650EAD2A2 /* NYTPhotoViewerCloseButtonX@2x.png */; }; + 171F70710819BE87270EFA05924971F4 /* NYTPhotoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A96A27F7E8595C88C9531E7CF754A42C /* NYTPhotoViewController.m */; }; + 1800397EDF43C932093838940EAAA045 /* NYTPhotosDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = C21AE0BF51688EC33F3530295270954C /* NYTPhotosDataSource.m */; }; + 183C8BCE6A8A8CA5FE2853FA7A16752A /* NYTPhotosOverlayView.h in Headers */ = {isa = PBXBuildFile; fileRef = 68CB521D81490E919F4C67BF5766A8A0 /* NYTPhotosOverlayView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1B7E21160BEF08CC76BA8C17E94E455A /* OCMLocation.m in Sources */ = {isa = PBXBuildFile; fileRef = 72C05092D1DCF7F77B1007CC48394741 /* OCMLocation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 20C39DB909C33B491D60F23FA1D415C2 /* OCMRealObjectForwarder.m in Sources */ = {isa = PBXBuildFile; fileRef = BFEFEBEFC9AC34B6DBF92B2945966247 /* OCMRealObjectForwarder.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 210933BCD4FBAFBA646D79E67E4EFF34 /* Pods-NYTPhotoViewer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DCC3DA2F14023E384CDB88FA771B7376 /* Pods-NYTPhotoViewer-dummy.m */; }; - 213ED3B0792A4D1510CAE75B41B05AFF /* NYTPhotosViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3995EDD5E49FC0C2C90FD250DE83382D /* NYTPhotosViewController.m */; }; - 26D65092A07D78DD295C75DCD5AFB1F2 /* NYTPhotoViewer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 57055F34F29B7610639451C480540F6C /* NYTPhotoViewer-dummy.m */; }; - 2DBEC7BF142147EC2EB66E9428444670 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = E5AE1D31BEB78C46CEEBD9A2E42D279C /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 21721F5FAF6C68D4B94C743FCDAEA790 /* NYTPhotosViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BFA570C0B1F268736D9A57B61FC5AC0 /* NYTPhotosViewController.m */; }; + 25EBFE1A355E5270C8C4E886D6FA1A6D /* NYTPhotoContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = A57B0D2B7A37D7FF6C68F57A2100B921 /* NYTPhotoContainer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2B20322155F43A8B6132E72BDB3DB723 /* NYTPhoto.h in Headers */ = {isa = PBXBuildFile; fileRef = F272208CEBC0979AF3E0744A2F82FDC8 /* NYTPhoto.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3009A71CCDC3E0A261D1DEFD79F8531D /* NYTPhotoCaptionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 52A46719EDEA6919CB7CE89CEA7D170B /* NYTPhotoCaptionView.m */; }; 3152811CD17686AA726713BFE3612206 /* OCMConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = B3A7959AAF13C4513F0A26907B05BE38 /* OCMConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 31FC31B5B5D90FFFD22E7D18E892AB27 /* NYTPhotosDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C09E9749B656F6F7F9316A81EA01C06 /* NYTPhotosDataSource.m */; }; - 333AE4B612DC5F563B6F7412D761FAE9 /* NYTPhotoViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = AF80F505D7D8D097B6E56BAEF73C872A /* NYTPhotoViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 33C4E9CA4B43CD4C468B338E2ED06860 /* OCMVerifier.h in Headers */ = {isa = PBXBuildFile; fileRef = F170EA151A6B5BB3B1185891240455B8 /* OCMVerifier.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 344846C012B1957DB0E2A25B619E875E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBC85ECBD828DF92AC9EEB8B18DA6F1 /* Foundation.framework */; }; 34AE6EE9360CA0D32BAAC84B94E0D29A /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B304EE4E3C9C59C6AC5562290B8E54A0 /* MobileCoreServices.framework */; }; 3A769EE15211B7EBBAF4B1C8AD542502 /* OCMFunctionsPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 9632A102BEFC5A696820ABD422C0FEB4 /* OCMFunctionsPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3A950D10507DE1B3D9F455947577C8E1 /* NYTPhotoTransitionAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 69F8308B753FD31BC37C6B25536F2140 /* NYTPhotoTransitionAnimator.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3A969D019F6F52E82EB1CB4DFCCD842C /* Pods-NYTPhotoViewer-SwiftTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 98F3701FC2ADBCB700525DEC45BF8F18 /* Pods-NYTPhotoViewer-SwiftTests-dummy.m */; }; - 3B2AC9E7E7289DC9D55623A383EC36EF /* NYTPhotoDismissalInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 87D64424FB9810772D6B77C600019B90 /* NYTPhotoDismissalInteractionController.m */; }; 3D1407E70C4B261294BB427D9600F75C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBC85ECBD828DF92AC9EEB8B18DA6F1 /* Foundation.framework */; }; - 3D258E9A843C52C991E5E9455CB8DB51 /* FLAnimatedImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E74F9B493212A5CA4B95EF7B6DBCB85 /* FLAnimatedImage-dummy.m */; }; - 3E8D7F08501841947BD13B51EC8B449B /* NYTPhotoViewerCloseButtonXLandscape@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = B271D7914F3BBE18B22AB38342AF3803 /* NYTPhotoViewerCloseButtonXLandscape@3x.png */; }; + 3D258E9A843C52C991E5E9455CB8DB51 /* FLAnimatedImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DFD7649EA2AC00E2DA8E2B447ABE63A7 /* FLAnimatedImage-dummy.m */; }; 3EEE56426C5838CA2F13E8F95B594401 /* OCMRecorder.m in Sources */ = {isa = PBXBuildFile; fileRef = B6520FC9FA7ACAF05FFA2A104D7BC74A /* OCMRecorder.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 3F494A3C6381E738036DBF57755839C5 /* NYTPhotoViewerCloseButtonX@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 98899FA2A9FDC7C35C5BDB88F86A11CB /* NYTPhotoViewerCloseButtonX@3x.png */; }; 40B2ABF25812A14D83A05D8937FBDB7B /* OCProtocolMockObject.h in Headers */ = {isa = PBXBuildFile; fileRef = ABA9A2401DD6B78C19450E4B5317EAFC /* OCProtocolMockObject.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 42FC45651FEB8FE1A9E4736040CB7B0E /* NYTPhotoContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = A26EEBF79D1FCEAB9FC8B48D54FA3E92 /* NYTPhotoContainer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 422CC40CE7C1DAE6334D28111C10491C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBC85ECBD828DF92AC9EEB8B18DA6F1 /* Foundation.framework */; }; 475BBAB1062B524EBF543ABD0ADA1829 /* Pods-Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F3D665965406E236F4F31B2B196DAC5 /* Pods-Tests-dummy.m */; }; 4CF0A4AD04F2F3CF7465991A5E76AD47 /* OCMStubRecorder.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D19A946EFEB0E767DEAC81E1B4E79D7 /* OCMStubRecorder.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 559A00371C2A2DE88312C5DFB729FA81 /* NSBundle+NYTPhotoViewer.h in Headers */ = {isa = PBXBuildFile; fileRef = D9B67330FFC89B83812990971C70910A /* NSBundle+NYTPhotoViewer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5030BA8BB5492165F062BD652988EBB4 /* NYTScalingImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C9AB20B04C92ADD97EF8A5693AC4 /* NYTScalingImageView.m */; }; 55EA7FCA2F507BCC25959CE95D295A8C /* OCMConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E9688896207877A736E092961E8E5CA /* OCMConstraint.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 55F2C7C98AB5E300663D064AAA64B80B /* OCMArgAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 973189E773DE18BAB80FDB24AF02C58A /* OCMArgAction.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 55FA6B09D105DEDDB1AAACFD6FF69B4D /* NYTPhotosDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E09EDD8693DA4EAB1AA460341C04088 /* NYTPhotosDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; 562C4A7A171B6F0000B132E22372C3DA /* OCPartialMockObject.h in Headers */ = {isa = PBXBuildFile; fileRef = C2E66F0C5763D1D42B63369B433D1180 /* OCPartialMockObject.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 581C67FF2A8524E1DAA2DBE038F385C9 /* NYTPhotoDismissalInteractionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1344C3852BE41C102B5E191610B89DC5 /* NYTPhotoDismissalInteractionController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 59BC54DA90AD2433D20358F9853622CA /* OCMMacroState.m in Sources */ = {isa = PBXBuildFile; fileRef = B5BA50A06BFCCE49101A4EA9DB780838 /* OCMMacroState.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 5BB246B2587EBC3E5597DBD6CD33777F /* NSMethodSignature+OCMAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E9218905F90589519D5C9E501403FD5F /* NSMethodSignature+OCMAdditions.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 5C49C7BE23104E4833DFF09CDE38F87D /* NYTPhotoViewerCloseButtonX.png in Resources */ = {isa = PBXBuildFile; fileRef = C3E9A885D5E9DA77276661C525199CD9 /* NYTPhotoViewerCloseButtonX.png */; }; 5E279FED57021E3C50468564F86AA8A0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBC85ECBD828DF92AC9EEB8B18DA6F1 /* Foundation.framework */; }; 5F04262019BBB326960E643861626099 /* OCMExceptionReturnValueProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 279BBD3C9C572DC7ED8957AA397482B3 /* OCMExceptionReturnValueProvider.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 60225E43F29FDCDDA5C106FEFADEF076 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B79803237D0CE63E235B8BB3964A0726 /* UIKit.framework */; }; + 60244C06E35A0C05A6F3FB1694B95BBF /* NYTPhotosOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 35B1FDF843FF7681C271B1B8B6B2C88D /* NYTPhotosOverlayView.m */; }; 651F3096B56BFF131C5F956001D7BAAB /* OCMArg.m in Sources */ = {isa = PBXBuildFile; fileRef = 15C391E1A916398055220E74FB12455B /* OCMArg.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 672FE514B7C1EB583AF6CEB2538025A7 /* OCMBoxedReturnValueProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 53D2EBBA2495B7A137B80E8BB7C00AA2 /* OCMBoxedReturnValueProvider.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 6CCBE8AA3641BC16165C2978C7909B58 /* NYTPhotosDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = FC428DB0728D3C890A048936FF11D546 /* NYTPhotosDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6C10E812F3AFFCBD5062BD599E05499E /* NYTPhotoDismissalInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = D0A9BF394870352693A8F730E148574B /* NYTPhotoDismissalInteractionController.m */; }; 6D2AD1DFA8F27BA0EBB3365A5AF7AC1B /* OCMExpectationRecorder.m in Sources */ = {isa = PBXBuildFile; fileRef = 9017344DB0E0D91029C98D909F46601D /* OCMExpectationRecorder.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 6DF6EB8F7E7738D44FD3BEC9321646C3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBC85ECBD828DF92AC9EEB8B18DA6F1 /* Foundation.framework */; }; 70AC31D0736F568C0386716176361D09 /* OCMInvocationMatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D6C86847B42822970F8110945431AB6 /* OCMInvocationMatcher.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7135CB1BBF84158EC60C90536AD92FC8 /* NYTPhotoCaptionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2FFE41789EE2840CC61D013E67C3EF16 /* NYTPhotoCaptionView.m */; }; - 71376B0D4095727E05901F2787086880 /* NYTPhotosOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = E70E5A6DAE02362043E6C3A42B17144B /* NYTPhotosOverlayView.m */; }; 71899DFD8094C412FFC39669279B4533 /* OCMBlockArgCaller.h in Headers */ = {isa = PBXBuildFile; fileRef = 39298D10B1AF6F64D12AEF39105C78C5 /* OCMBlockArgCaller.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 71CFED44C6B6DFC86B8DFCC574F6B8E4 /* NYTPhotoTransitionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D998033226514D2EC165F848A5C8C25 /* NYTPhotoTransitionController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 784F1A8416EA6268640F5E75E1E638E5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBC85ECBD828DF92AC9EEB8B18DA6F1 /* Foundation.framework */; }; + 7AE83DFAD9756ED1FB1CB5E36F9CF6EB /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BA5D458ED36671F4746AEABDAED29C17 /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7C7C91B0D616ADD86E208713A22419B9 /* NSBundle+NYTPhotoViewer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E8CBA03245CE3B5C11D88D402467BE7 /* NSBundle+NYTPhotoViewer.m */; }; 7EE0FD33AB30006545874DEF02F9243E /* OCMNotificationPoster.m in Sources */ = {isa = PBXBuildFile; fileRef = 45335C03F34A383F34E517DADC72434F /* OCMNotificationPoster.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 7FFCEEC0036EC9E7A5D3BAD719B28D4A /* NSNotificationCenter+OCMAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 5691FC56E16BB852D31B5C2AF7367AE3 /* NSNotificationCenter+OCMAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 830B3A29668D59C62571A4CE4D3BAFCA /* OCMIndirectReturnValueProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = D6506560499D9CF41A49EE06AD59D906 /* OCMIndirectReturnValueProvider.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 860D30D1BB955B32A3A947C6154E417A /* NYTPhotoTransitionAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 36E29385C5DAB9E9FD449AFD8D00E088 /* NYTPhotoTransitionAnimator.m */; }; 87AA263FA688A8E92C2B8ADEE72C98C6 /* OCMObserverRecorder.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C968E4417F50EBE13D935B280709ED2 /* OCMObserverRecorder.h */; settings = {ATTRIBUTES = (Project, ); }; }; 8A1370FF0DD475F945954535A988ED4B /* OCMockObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D1FBC04E5306A91390D2C59B29A0A45 /* OCMockObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8AD3CBF5EFD13418B67B7DBD7673CE9C /* NYTPhotosViewControllerDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 841176779F5748D4E85904F14BBAAF32 /* NYTPhotosViewControllerDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8AEB5737F1DA5540B3BDB2DDCE2D7401 /* NYTPhotoTransitionAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E3CA746E4CF52E8A7372029183A6E69 /* NYTPhotoTransitionAnimator.m */; }; + 8AEFADC427762A8A3071EC11B058E560 /* NYTPhotoViewerCloseButtonXLandscape@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EF36C267040C056833C738BF6A83715 /* NYTPhotoViewerCloseButtonXLandscape@2x.png */; }; 8D40AF80800C0D4A691F4A0656E53D98 /* OCMRealObjectForwarder.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E26B1A1CA12E1024027283E572C92A6 /* OCMRealObjectForwarder.h */; settings = {ATTRIBUTES = (Project, ); }; }; 94216C983E91F2BA503920465DE1972A /* OCClassMockObject.h in Headers */ = {isa = PBXBuildFile; fileRef = FDC2EB857342A0F7825BAA82E87A03E3 /* OCClassMockObject.h */; settings = {ATTRIBUTES = (Project, ); }; }; 950C209E1D004EBDCD43D6C2136B5AA2 /* OCMStubRecorder.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0C50397B5BE45862226C08BEE972A9 /* OCMStubRecorder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 96AA6CBA703C2690A707AF3E9099032C /* NSBundle+NYTPhotoViewer.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9C5F374B788B38F7577CBACD6374D1 /* NSBundle+NYTPhotoViewer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 97E7A55C33E1C7717A8BE961F6547D13 /* NYTPhotoTransitionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E0C66159C5486540FCCAE67BEA34892 /* NYTPhotoTransitionController.m */; }; + 9A4FD7CA85278E4080D9567479369546 /* NYTPhotoViewerCloseButtonX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 84BCB2FD814B25FC5DF03FD650EAD2A2 /* NYTPhotoViewerCloseButtonX@2x.png */; }; 9C195CB2280DCD3183057794B4504B22 /* OCMRecorder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8417B4A576326FD5B69E414C3E0BCAC8 /* OCMRecorder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9ED6B48F0C000C83C89249483D3398A6 /* OCMFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = ADAE12538446AEDF3DE9593F2108322B /* OCMFunctions.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; A425B4C6EAA79B2C9BB4F374180DC194 /* NSValue+OCMAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C5CDA59660820CDB2B09268A49054F1 /* NSValue+OCMAdditions.h */; settings = {ATTRIBUTES = (Project, ); }; }; A516CB608A827C4FEA550CB372854AF7 /* OCMReturnValueProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 648B832E9713AA7AF2DD04B3A4860884 /* OCMReturnValueProvider.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - A5CA2F907A3B997DADDC7FCE44F56F25 /* NYTPhotoViewerCloseButtonXLandscape@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EF36C267040C056833C738BF6A83715 /* NYTPhotoViewerCloseButtonXLandscape@2x.png */; }; - A727B1CADD4A915906030B560F237124 /* NYTPhotoTransitionController.m in Sources */ = {isa = PBXBuildFile; fileRef = CDF977ECCBAF9FDD4516B23027E3BEE4 /* NYTPhotoTransitionController.m */; }; - AB5E80218B841C79963B69C7FB5B6378 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 620B31E6A0622F4890F7870EF5FC6EEB /* FLAnimatedImage.m */; }; AD672A92EF1A71CB35F77D51924A63D7 /* OCMInvocationStub.h in Headers */ = {isa = PBXBuildFile; fileRef = 39795D3BE594F7B39D0AED9BDFF57905 /* OCMInvocationStub.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B0E05562A115CEC19523EC0337D4391A /* NYTPhotoViewerCloseButtonX.png in Resources */ = {isa = PBXBuildFile; fileRef = C3E9A885D5E9DA77276661C525199CD9 /* NYTPhotoViewerCloseButtonX.png */; }; + B184CBA7492201A7F61468F027FFBE7F /* NYTScalingImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DC9C91E71106B35175DE328DCDCA7AA /* NYTScalingImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; B28B82281F2A75B1A27E9B1B289B179D /* OCClassMockObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 3595EAD9437F9960F3C3E6C490EB3ABA /* OCClassMockObject.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - B2FEB00BCB5AAD8D5030F7A8017630AC /* NYTPhotoViewerCloseButtonXLandscape.png in Resources */ = {isa = PBXBuildFile; fileRef = 6128F498EC184A5F67CC3EE7FF8BC11B /* NYTPhotoViewerCloseButtonXLandscape.png */; }; B36995CF7E36CC57C8C118EC5EC049A6 /* OCMock-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2ED407E08183A0D1212BCB2EEC11A4E5 /* OCMock-dummy.m */; }; + B3AA789E74DBAB167DAD0FDCA19690C7 /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = B752F47FD8479CA6FDE16B864DFE3BD6 /* FLAnimatedImageView.m */; }; + B466ACC84DEB3B813EDBFFEC95760AB3 /* NYTPhotosViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D275C43CB9D76E11C8D859651EE5D49 /* NYTPhotosViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; B4D6973B3F74EB04E719BFCFCBF04C0B /* OCMInvocationStub.m in Sources */ = {isa = PBXBuildFile; fileRef = 4507027DC7568BD104F0729CEC2FE4F3 /* OCMInvocationStub.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - B657A5BB60555A640B56D1CAF4844E1C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B79803237D0CE63E235B8BB3964A0726 /* UIKit.framework */; }; BC7143B82E45DDE808B1D8E8F6970E41 /* OCMInvocationExpectation.h in Headers */ = {isa = PBXBuildFile; fileRef = F95176C5920DC50D4337C850A2F982E4 /* OCMInvocationExpectation.h */; settings = {ATTRIBUTES = (Project, ); }; }; C01520F21314A4A11E0BD5C9BE190A1A /* OCMExpectationRecorder.h in Headers */ = {isa = PBXBuildFile; fileRef = DC347E4D58FA4006D0DB039E114C4197 /* OCMExpectationRecorder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C16820E10B6EFB7D2EF419A18BECD7A1 /* NSBundle+NYTPhotoViewer.m in Sources */ = {isa = PBXBuildFile; fileRef = 68E7E36B7D1E70CD7E887B412BBF762F /* NSBundle+NYTPhotoViewer.m */; }; + C21FA017A42E8B1CA9CC3F9C1F88318F /* NYTPhotoTransitionAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 2491FAB95107BC50DD0CF5CC6146FD13 /* NYTPhotoTransitionAnimator.h */; settings = {ATTRIBUTES = (Public, ); }; }; C2596CDB92D59D7FC5505505B68FD55C /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FDC947C2C4A736687249A5D97209C29B /* CoreGraphics.framework */; }; C4235F3704F471BAF74CB4482A99D340 /* OCMReturnValueProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 0036B91691E79FAAD7625F40D5F57D56 /* OCMReturnValueProvider.h */; settings = {ATTRIBUTES = (Project, ); }; }; C508640C7607A5BE183916AC4202A026 /* OCMInvocationMatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 78D74C4D5A45C6EA54A64F0865D7A416 /* OCMInvocationMatcher.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; C55C0B0594D26DE09DEC7F161910A211 /* OCObserverMockObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 5400FB5B71623EB9F3634D026D88B09B /* OCObserverMockObject.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + C624AEA7F64F268ECC7A636D0B118185 /* NYTPhotoCaptionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 1781D669D30BF31E3D30458C11401EC4 /* NYTPhotoCaptionView.h */; settings = {ATTRIBUTES = (Public, ); }; }; C6DEDAD5B01946A2644F428020F881B6 /* OCObserverMockObject.h in Headers */ = {isa = PBXBuildFile; fileRef = A118FA0DF9EDA4523D44E32EBD8B46DE /* OCObserverMockObject.h */; settings = {ATTRIBUTES = (Project, ); }; }; C796F27878B148315E4EB60535EEA4BE /* OCMLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = A4AEE7E7536BA5005C87B09A47B8D2BA /* OCMLocation.h */; settings = {ATTRIBUTES = (Public, ); }; }; C9D4A031824B3CFEEEBDD7F8B57CC161 /* Pods-NYTPhotoViewer-Swift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F702EA88D0926BE8D736994211CD85F8 /* Pods-NYTPhotoViewer-Swift-dummy.m */; }; - CBDB0E7C7E6663E42BAABC210A4E0744 /* NYTPhotoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 91A07D254746A5ED4897215F2F9F45AE /* NYTPhotoViewController.m */; }; CC40C17D2E01DDDF48A7A8D50B8E92F8 /* OCMMacroState.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8E1E7CEE735DA4896915A276D1BC40 /* OCMMacroState.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4F14C27B167A64F09A356652410909 /* OCMInvocationExpectation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C0D80914E2D996F2D7260CA8AFD0002 /* OCMInvocationExpectation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; CC5C84B30927F4CE48D7EC04BF652005 /* OCMockObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 1CC85561A09A114A310B0AF1522218FC /* OCMockObject.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - CCA2FEDC4ED916CB5EC825D1AF89F57A /* NYTPhoto.h in Headers */ = {isa = PBXBuildFile; fileRef = 16627F33953921BDE35AD99AC4B16D9B /* NYTPhoto.h */; settings = {ATTRIBUTES = (Public, ); }; }; CE1D11A21BB0D710B640F31B18935BF3 /* NSObject+OCMAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E918988881A1DC5DD9C73611C699B5EF /* NSObject+OCMAdditions.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D0487B97CDAE11C119336FD22A1B09DE /* NYTPhotoViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 04B574365EAB5934994AE69CFBDAD936 /* NYTPhotoViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D21CCD2E0296D920702D681D6B74F877 /* NYTPhotoViewerCloseButtonXLandscape.png in Resources */ = {isa = PBXBuildFile; fileRef = 6128F498EC184A5F67CC3EE7FF8BC11B /* NYTPhotoViewerCloseButtonXLandscape.png */; }; D470FD7FF206B100A7B79714E7FA0F4A /* OCMNotificationPoster.h in Headers */ = {isa = PBXBuildFile; fileRef = CFB26DA0397EDEC97F9223686DCAA7D3 /* OCMNotificationPoster.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D7157508A3553D7A221A5BC03CF923D7 /* NYTPhotosViewControllerDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = AF44970518DE4EC399BCB7CF344B15CF /* NYTPhotosViewControllerDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; D78D41AA2CEB6ED571503108CEC3DA15 /* OCMArg.h in Headers */ = {isa = PBXBuildFile; fileRef = E6E09C6F8F457DEBE5871EECECA22A0A /* OCMArg.h */; settings = {ATTRIBUTES = (Public, ); }; }; D9EA9C8052853B8962318FFD5A5551B6 /* OCMExceptionReturnValueProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 08B71F32EE94E5A8391738FB0EB578EC /* OCMExceptionReturnValueProvider.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; DADACF239B30C047FA9304E5FDDA8B2E /* NSObject+OCMAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 96B119F83993011B3B3A99E169B1D92C /* NSObject+OCMAdditions.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - DD4C56F24DC87BF889ABE78AE427358E /* NYTPhotoTransitionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E3143757CF12CCB20A3A293D1C4A376 /* NYTPhotoTransitionController.h */; settings = {ATTRIBUTES = (Public, ); }; }; DE57384C891A85506CB91EA186D2D2B4 /* OCMArgAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 31077C653BEFF474A8C48CB9E2C4F3CE /* OCMArgAction.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DED547A2EE62709BFCF833CB152D9F66 /* NYTPhotosOverlayView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D8F7644580B335B9EEA76DB6DE65603 /* NYTPhotosOverlayView.h */; settings = {ATTRIBUTES = (Public, ); }; }; DF0A3CB81B12C054F9C8258F680F7C9D /* OCPartialMockObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 02F2DC63DEA3B6AAE0C42C4CF53DEAC5 /* OCPartialMockObject.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; E00ABE7FC44CB9D1B511D96D47C16AD5 /* NSInvocation+OCMAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D8259D40CEC85A11AF991C76F56038 /* NSInvocation+OCMAdditions.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; E2D2C2DEBBB651077ABC3710A423594F /* NSValue+OCMAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = A4BEB6AAF8E89B3D88516B5143A282CF /* NSValue+OCMAdditions.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; E45D617A6259C90DC54D6F22571998E8 /* OCMPassByRefSetter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AC5F56E5B643D51DD4548F881C2934D /* OCMPassByRefSetter.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E7B12EB9B2A6443B0FB6541B46DB1DB9 /* NYTPhotoViewer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 57055F34F29B7610639451C480540F6C /* NYTPhotoViewer-dummy.m */; }; E8CDCEDCDC0ADE51EBAFCC09F44EFF12 /* OCMBlockArgCaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C4B5E15B42999732406D11FF27399E /* OCMBlockArgCaller.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + E99CE64289F5FDD09B7E1188379AED41 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 0302D606627AFF213D39DE2877B4638D /* FLAnimatedImage.m */; }; EA2A970253EA9B298F0BB63864AA18D1 /* OCProtocolMockObject.m in Sources */ = {isa = PBXBuildFile; fileRef = D2F9528FC984AA1AC37E0C37A193A06E /* OCProtocolMockObject.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; ED61A6F91BC025BD57D6BD2A504E1DA4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBC85ECBD828DF92AC9EEB8B18DA6F1 /* Foundation.framework */; }; - EEA564BB9C181F381481427368B805BA /* NYTScalingImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = B94C357DAD56E2A6961073E46E0B35DA /* NYTScalingImageView.m */; }; EEBEC3C68DD8C679511876B4610D582A /* OCMBoxedReturnValueProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = A9A8A71E9B0A1271A4EDDE402221428C /* OCMBoxedReturnValueProvider.h */; settings = {ATTRIBUTES = (Project, ); }; }; F0E9BE1709D8B3501A9E791E8D36FBED /* NSNotificationCenter+OCMAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0D5801E0E8C2C07D2E34E8AED0B8D3 /* NSNotificationCenter+OCMAdditions.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - F5872852E80C246A0B2FC6DBCD6A1633 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = CE2F8A707A81C6B5DBE56FDC7F49C991 /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; F5C01AC5B350E12C063267A3FE002E5C /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 89FBE0107A6C5519C16F855DD8133A06 /* ImageIO.framework */; }; - F82338CC3F882FAA29C161219E124753 /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F8F34E433F8134AF7BD460EACB9D4AF /* FLAnimatedImageView.m */; }; FB294C8C8DCC4EACB074C58C027C9723 /* OCMIndirectReturnValueProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = DFEE15C59F74D39729145BD29145FE5E /* OCMIndirectReturnValueProvider.h */; settings = {ATTRIBUTES = (Project, ); }; }; + FB423EE72C2A6D0ED5DEFBEE9BE80A98 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 1777FBF7AB53EABE912D85E7E0556670 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FBB048FC0930D06D3946FF941CFDF555 /* NYTPhotoCaptionViewLayoutWidthHinting.h in Headers */ = {isa = PBXBuildFile; fileRef = 2891A0D8A07EB10D5EA116698072DFAA /* NYTPhotoCaptionViewLayoutWidthHinting.h */; settings = {ATTRIBUTES = (Public, ); }; }; FDFD77CF38AE5FDD235A02217B763809 /* OCMBlockCaller.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D21982DA2CC6317653C58D0C155AD1F /* OCMBlockCaller.h */; settings = {ATTRIBUTES = (Project, ); }; }; + FF89D64A56347C235B8A081539AF9DD2 /* NYTPhotoDismissalInteractionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E251763ABC4628F9FD370376C62339C /* NYTPhotoDismissalInteractionController.h */; settings = {ATTRIBUTES = (Public, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 2D4A0D8C8330D3B6915B4A8090600D4D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1A79BA86DB198181905CBBFC1F1E6701; - remoteInfo = FLAnimatedImage; - }; 2FAE342CFFFA5C8159FEA9D856247783 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; @@ -155,14 +149,14 @@ isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = FD07CF7E0940CA0E837960FB607AAB32; + remoteGlobalIDString = 0654143889A23F99F0114BE527E8E3B0; remoteInfo = NYTPhotoViewer; }; 51BA6C87CEFC9F55F8E5003AF5DBA923 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = FD07CF7E0940CA0E837960FB607AAB32; + remoteGlobalIDString = 0654143889A23F99F0114BE527E8E3B0; remoteInfo = NYTPhotoViewer; }; 536F3ACDA6C6E493B53CD6E1DD1FFF6B /* PBXContainerItemProxy */ = { @@ -176,14 +170,14 @@ isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = FD07CF7E0940CA0E837960FB607AAB32; + remoteGlobalIDString = 0654143889A23F99F0114BE527E8E3B0; remoteInfo = NYTPhotoViewer; }; 7EBE4843A061104AB6084A9768B3499B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = FD07CF7E0940CA0E837960FB607AAB32; + remoteGlobalIDString = 0654143889A23F99F0114BE527E8E3B0; remoteInfo = NYTPhotoViewer; }; 9FE7D691C8923353B319580F5981D029 /* PBXContainerItemProxy */ = { @@ -193,12 +187,12 @@ remoteGlobalIDString = 1A79BA86DB198181905CBBFC1F1E6701; remoteInfo = FLAnimatedImage; }; - A9CF70A82AE001498FB9F09811E4FE9B /* PBXContainerItemProxy */ = { + AE3809356F577E09124E08D48D549B45 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = BAF9C6775FDBB0362A663E43AD7E2078; - remoteInfo = "NYTPhotoViewer-NYTPhotoViewer"; + remoteGlobalIDString = 1A79BA86DB198181905CBBFC1F1E6701; + remoteInfo = FLAnimatedImage; }; AF47FE2DB728285ED7B873C40660842C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; @@ -207,6 +201,13 @@ remoteGlobalIDString = 4A2CAA839F2722C796C6F1DFDC806B92; remoteInfo = OCMock; }; + B6A43A6161806CE532F207A79B63D406 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 693C39C58B0B71A71225DDAE17874B3E; + remoteInfo = "NYTPhotoViewer-NYTPhotoViewer"; + }; CE0EF9B38D1CB9097F8EE2059CD8B3C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; @@ -220,51 +221,53 @@ 0036B91691E79FAAD7625F40D5F57D56 /* OCMReturnValueProvider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMReturnValueProvider.h; path = Source/OCMock/OCMReturnValueProvider.h; sourceTree = ""; }; 015910EC2578EF7210EA0A4954B52AD9 /* Pods-NYTPhotoViewer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-NYTPhotoViewer.debug.xcconfig"; sourceTree = ""; }; 02F2DC63DEA3B6AAE0C42C4CF53DEAC5 /* OCPartialMockObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCPartialMockObject.m; path = Source/OCMock/OCPartialMockObject.m; sourceTree = ""; }; + 0302D606627AFF213D39DE2877B4638D /* FLAnimatedImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FLAnimatedImage.m; path = FLAnimatedImage/FLAnimatedImage.m; sourceTree = ""; }; + 04B574365EAB5934994AE69CFBDAD936 /* NYTPhotoViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotoViewController.h; sourceTree = ""; }; 064E1C219125C6C9038C857CA3BD6583 /* NYTPhotoViewer.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = NYTPhotoViewer.xcconfig; sourceTree = ""; }; + 06692780E124290FDB6556C283DCEEAD /* FLAnimatedImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FLAnimatedImage.xcconfig; sourceTree = ""; }; 08B71F32EE94E5A8391738FB0EB578EC /* OCMExceptionReturnValueProvider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMExceptionReturnValueProvider.m; path = Source/OCMock/OCMExceptionReturnValueProvider.m; sourceTree = ""; }; 0B9C2EF14DDBCDD41F6D3A9D98ABAE82 /* OCMFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMFunctions.h; path = Source/OCMock/OCMFunctions.h; sourceTree = ""; }; 0C5CDA59660820CDB2B09268A49054F1 /* NSValue+OCMAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSValue+OCMAdditions.h"; path = "Source/OCMock/NSValue+OCMAdditions.h"; sourceTree = ""; }; - 0CEC2EB950AAEA9853DC4BE18841D0E5 /* NYTPhotoCaptionView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotoCaptionView.h; sourceTree = ""; }; - 1137C13C6691991C91192964662F6FAC /* FLAnimatedImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FLAnimatedImage.xcconfig; sourceTree = ""; }; + 0E09EDD8693DA4EAB1AA460341C04088 /* NYTPhotosDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotosDataSource.h; sourceTree = ""; }; + 0EB8C9AB20B04C92ADD97EF8A5693AC4 /* NYTScalingImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTScalingImageView.m; sourceTree = ""; }; 11A9FDBFCDA87A560F7172E37E8B2FA4 /* Pods-NYTPhotoViewer-Swift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-NYTPhotoViewer-Swift.release.xcconfig"; sourceTree = ""; }; - 1344C3852BE41C102B5E191610B89DC5 /* NYTPhotoDismissalInteractionController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotoDismissalInteractionController.h; sourceTree = ""; }; 14C0EE5854C75187952451BDF0000DBD /* libPods-NYTPhotoViewer-Swift.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-NYTPhotoViewer-Swift.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 15C391E1A916398055220E74FB12455B /* OCMArg.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMArg.m; path = Source/OCMock/OCMArg.m; sourceTree = ""; }; - 16627F33953921BDE35AD99AC4B16D9B /* NYTPhoto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhoto.h; sourceTree = ""; }; + 1777FBF7AB53EABE912D85E7E0556670 /* FLAnimatedImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FLAnimatedImage.h; path = FLAnimatedImage/FLAnimatedImage.h; sourceTree = ""; }; + 1781D669D30BF31E3D30458C11401EC4 /* NYTPhotoCaptionView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotoCaptionView.h; sourceTree = ""; }; 1AC5F56E5B643D51DD4548F881C2934D /* OCMPassByRefSetter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMPassByRefSetter.h; path = Source/OCMock/OCMPassByRefSetter.h; sourceTree = ""; }; 1CC85561A09A114A310B0AF1522218FC /* OCMockObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMockObject.m; path = Source/OCMock/OCMockObject.m; sourceTree = ""; }; 1D21982DA2CC6317653C58D0C155AD1F /* OCMBlockCaller.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMBlockCaller.h; path = Source/OCMock/OCMBlockCaller.h; sourceTree = ""; }; 1F2D53EE162B13CFB4CDFF6EE503B571 /* Pods-NYTPhotoViewer-Swift-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-NYTPhotoViewer-Swift-resources.sh"; sourceTree = ""; }; 22CC099EDADB76C55367796DBD37AE8D /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; 2412F8FD2DB0F9BD2B67B6D625B37720 /* Pods-NYTPhotoViewer-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-NYTPhotoViewer-resources.sh"; sourceTree = ""; }; + 2491FAB95107BC50DD0CF5CC6146FD13 /* NYTPhotoTransitionAnimator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotoTransitionAnimator.h; sourceTree = ""; }; 24A1662B019F68EB6B2FF25D82FA7E57 /* Pods-NYTPhotoViewer-Swift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-NYTPhotoViewer-Swift.debug.xcconfig"; sourceTree = ""; }; 279BBD3C9C572DC7ED8957AA397482B3 /* OCMExceptionReturnValueProvider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMExceptionReturnValueProvider.h; path = Source/OCMock/OCMExceptionReturnValueProvider.h; sourceTree = ""; }; + 2891A0D8A07EB10D5EA116698072DFAA /* NYTPhotoCaptionViewLayoutWidthHinting.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotoCaptionViewLayoutWidthHinting.h; sourceTree = ""; }; + 2D275C43CB9D76E11C8D859651EE5D49 /* NYTPhotosViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotosViewController.h; sourceTree = ""; }; + 2DC9C91E71106B35175DE328DCDCA7AA /* NYTScalingImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTScalingImageView.h; sourceTree = ""; }; + 2E3CA746E4CF52E8A7372029183A6E69 /* NYTPhotoTransitionAnimator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoTransitionAnimator.m; sourceTree = ""; }; 2ED407E08183A0D1212BCB2EEC11A4E5 /* OCMock-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "OCMock-dummy.m"; sourceTree = ""; }; - 2FFE41789EE2840CC61D013E67C3EF16 /* NYTPhotoCaptionView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoCaptionView.m; sourceTree = ""; }; 31077C653BEFF474A8C48CB9E2C4F3CE /* OCMArgAction.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMArgAction.h; path = Source/OCMock/OCMArgAction.h; sourceTree = ""; }; 3312F3BB9EB529E361D7557F11720647 /* libNYTPhotoViewer.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libNYTPhotoViewer.a; sourceTree = BUILT_PRODUCTS_DIR; }; 3529BF22431013E7BB6E418B1F38256E /* libPods-NYTPhotoViewer.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-NYTPhotoViewer.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 3595EAD9437F9960F3C3E6C490EB3ABA /* OCClassMockObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCClassMockObject.m; path = Source/OCMock/OCClassMockObject.m; sourceTree = ""; }; - 36E29385C5DAB9E9FD449AFD8D00E088 /* NYTPhotoTransitionAnimator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoTransitionAnimator.m; sourceTree = ""; }; + 35B1FDF843FF7681C271B1B8B6B2C88D /* NYTPhotosOverlayView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTPhotosOverlayView.m; sourceTree = ""; }; 39298D10B1AF6F64D12AEF39105C78C5 /* OCMBlockArgCaller.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMBlockArgCaller.h; path = Source/OCMock/OCMBlockArgCaller.h; sourceTree = ""; }; 39795D3BE594F7B39D0AED9BDFF57905 /* OCMInvocationStub.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMInvocationStub.h; path = Source/OCMock/OCMInvocationStub.h; sourceTree = ""; }; - 3995EDD5E49FC0C2C90FD250DE83382D /* NYTPhotosViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTPhotosViewController.m; sourceTree = ""; }; - 3C1BD56355078ED0311DA2E365268202 /* NYTScalingImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTScalingImageView.h; sourceTree = ""; }; - 3E74F9B493212A5CA4B95EF7B6DBCB85 /* FLAnimatedImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FLAnimatedImage-dummy.m"; sourceTree = ""; }; 3EF36C267040C056833C738BF6A83715 /* NYTPhotoViewerCloseButtonXLandscape@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "NYTPhotoViewerCloseButtonXLandscape@2x.png"; sourceTree = ""; }; - 3F1AF8DD08D62A5BDD9BC5313F8DE607 /* NYTPhotosViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotosViewController.h; sourceTree = ""; }; 3F3D665965406E236F4F31B2B196DAC5 /* Pods-Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Tests-dummy.m"; sourceTree = ""; }; - 3F8F34E433F8134AF7BD460EACB9D4AF /* FLAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FLAnimatedImageView.m; path = FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImageView.m; sourceTree = ""; }; 4064C262053F71DE29600E5D90AF88A4 /* Pods-Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Tests-acknowledgements.plist"; sourceTree = ""; }; 422E1E1847C5FC6857026E551B81314E /* Pods-NYTPhotoViewer-SwiftTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-NYTPhotoViewer-SwiftTests.debug.xcconfig"; sourceTree = ""; }; 42E3ACBE85CB1F629512FB5F81764DA2 /* NYTPhotoViewer-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NYTPhotoViewer-prefix.pch"; sourceTree = ""; }; 4507027DC7568BD104F0729CEC2FE4F3 /* OCMInvocationStub.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMInvocationStub.m; path = Source/OCMock/OCMInvocationStub.m; sourceTree = ""; }; 45335C03F34A383F34E517DADC72434F /* OCMNotificationPoster.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMNotificationPoster.m; path = Source/OCMock/OCMNotificationPoster.m; sourceTree = ""; }; 4ABCF2A17701A801D94CD9AA17E43D0F /* Pods-NYTPhotoViewer-Swift-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-NYTPhotoViewer-Swift-acknowledgements.plist"; sourceTree = ""; }; - 4C09E9749B656F6F7F9316A81EA01C06 /* NYTPhotosDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTPhotosDataSource.m; sourceTree = ""; }; 4C0D5801E0E8C2C07D2E34E8AED0B8D3 /* NSNotificationCenter+OCMAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSNotificationCenter+OCMAdditions.m"; path = "Source/OCMock/NSNotificationCenter+OCMAdditions.m"; sourceTree = ""; }; 4D1FBC04E5306A91390D2C59B29A0A45 /* OCMockObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMockObject.h; path = Source/OCMock/OCMockObject.h; sourceTree = ""; }; 4E26B1A1CA12E1024027283E572C92A6 /* OCMRealObjectForwarder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMRealObjectForwarder.h; path = Source/OCMock/OCMRealObjectForwarder.h; sourceTree = ""; }; + 52A46719EDEA6919CB7CE89CEA7D170B /* NYTPhotoCaptionView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoCaptionView.m; sourceTree = ""; }; 53D2EBBA2495B7A137B80E8BB7C00AA2 /* OCMBoxedReturnValueProvider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMBoxedReturnValueProvider.m; path = Source/OCMock/OCMBoxedReturnValueProvider.m; sourceTree = ""; }; 5400FB5B71623EB9F3634D026D88B09B /* OCObserverMockObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCObserverMockObject.m; path = Source/OCMock/OCObserverMockObject.m; sourceTree = ""; }; 5691FC56E16BB852D31B5C2AF7367AE3 /* NSNotificationCenter+OCMAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSNotificationCenter+OCMAdditions.h"; path = "Source/OCMock/NSNotificationCenter+OCMAdditions.h"; sourceTree = ""; }; @@ -273,33 +276,33 @@ 5D6C86847B42822970F8110945431AB6 /* OCMInvocationMatcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMInvocationMatcher.h; path = Source/OCMock/OCMInvocationMatcher.h; sourceTree = ""; }; 60DDAC8D2C58974210DA6772C11410BA /* Pods-NYTPhotoViewer-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-NYTPhotoViewer-acknowledgements.plist"; sourceTree = ""; }; 6128F498EC184A5F67CC3EE7FF8BC11B /* NYTPhotoViewerCloseButtonXLandscape.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = NYTPhotoViewerCloseButtonXLandscape.png; sourceTree = ""; }; - 620B31E6A0622F4890F7870EF5FC6EEB /* FLAnimatedImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FLAnimatedImage.m; path = FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImage.m; sourceTree = ""; }; 648B832E9713AA7AF2DD04B3A4860884 /* OCMReturnValueProvider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMReturnValueProvider.m; path = Source/OCMock/OCMReturnValueProvider.m; sourceTree = ""; }; 64B6E627F3949DD7F4127D2C687AA09D /* Pods-NYTPhotoViewer-Swift-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-NYTPhotoViewer-Swift-frameworks.sh"; sourceTree = ""; }; - 68E7E36B7D1E70CD7E887B412BBF762F /* NSBundle+NYTPhotoViewer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NSBundle+NYTPhotoViewer.m"; sourceTree = ""; }; - 69F8308B753FD31BC37C6B25536F2140 /* NYTPhotoTransitionAnimator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotoTransitionAnimator.h; sourceTree = ""; }; + 68CB521D81490E919F4C67BF5766A8A0 /* NYTPhotosOverlayView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotosOverlayView.h; sourceTree = ""; }; 6D19A946EFEB0E767DEAC81E1B4E79D7 /* OCMStubRecorder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMStubRecorder.m; path = Source/OCMock/OCMStubRecorder.m; sourceTree = ""; }; 6D72CFFCA56C168C0A7FE7F810A4B3C4 /* libPods-Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 6E0C66159C5486540FCCAE67BEA34892 /* NYTPhotoTransitionController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoTransitionController.m; sourceTree = ""; }; 6E9688896207877A736E092961E8E5CA /* OCMConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMConstraint.m; path = Source/OCMock/OCMConstraint.m; sourceTree = ""; }; 716AB915F484AA18D1981D68DCB80C20 /* libFLAnimatedImage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libFLAnimatedImage.a; sourceTree = BUILT_PRODUCTS_DIR; }; 72C05092D1DCF7F77B1007CC48394741 /* OCMLocation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMLocation.m; path = Source/OCMock/OCMLocation.m; sourceTree = ""; }; 78D74C4D5A45C6EA54A64F0865D7A416 /* OCMInvocationMatcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMInvocationMatcher.m; path = Source/OCMock/OCMInvocationMatcher.m; sourceTree = ""; }; 7B8337F919BD3F92A18BC349D5F01A8D /* OCMock.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = OCMock.xcconfig; sourceTree = ""; }; + 7BFA570C0B1F268736D9A57B61FC5AC0 /* NYTPhotosViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTPhotosViewController.m; sourceTree = ""; }; 7C968E4417F50EBE13D935B280709ED2 /* OCMObserverRecorder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMObserverRecorder.h; path = Source/OCMock/OCMObserverRecorder.h; sourceTree = ""; }; - 7E3143757CF12CCB20A3A293D1C4A376 /* NYTPhotoTransitionController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotoTransitionController.h; sourceTree = ""; }; 7F47FC42F86323FC5127F7B9CA01D51A /* Pods-NYTPhotoViewer-SwiftTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-NYTPhotoViewer-SwiftTests-acknowledgements.markdown"; sourceTree = ""; }; 814AEB5E1354012135422C0913AE8797 /* NSInvocation+OCMAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSInvocation+OCMAdditions.h"; path = "Source/OCMock/NSInvocation+OCMAdditions.h"; sourceTree = ""; }; 836BE698CCA819505512E939D585B9DC /* Pods-Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Tests.release.xcconfig"; sourceTree = ""; }; 840B1E0F0754CB1D57203540C05B3057 /* Pods-NYTPhotoViewer-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-NYTPhotoViewer-frameworks.sh"; sourceTree = ""; }; + 841176779F5748D4E85904F14BBAAF32 /* NYTPhotosViewControllerDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotosViewControllerDataSource.h; sourceTree = ""; }; 8417B4A576326FD5B69E414C3E0BCAC8 /* OCMRecorder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMRecorder.h; path = Source/OCMock/OCMRecorder.h; sourceTree = ""; }; 84BCB2FD814B25FC5DF03FD650EAD2A2 /* NYTPhotoViewerCloseButtonX@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "NYTPhotoViewerCloseButtonX@2x.png"; sourceTree = ""; }; - 87D64424FB9810772D6B77C600019B90 /* NYTPhotoDismissalInteractionController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoDismissalInteractionController.m; sourceTree = ""; }; 89FBE0107A6C5519C16F855DD8133A06 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; 8B368F633457B0DB0830B17B921F8C1C /* OCMock.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMock.h; path = Source/OCMock/OCMock.h; sourceTree = ""; }; 8BC17DD2A105099A033DC2939727EEA1 /* Pods-NYTPhotoViewer-SwiftTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-NYTPhotoViewer-SwiftTests-resources.sh"; sourceTree = ""; }; - 8D8F7644580B335B9EEA76DB6DE65603 /* NYTPhotosOverlayView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotosOverlayView.h; sourceTree = ""; }; + 8D998033226514D2EC165F848A5C8C25 /* NYTPhotoTransitionController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotoTransitionController.h; sourceTree = ""; }; + 8E251763ABC4628F9FD370376C62339C /* NYTPhotoDismissalInteractionController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotoDismissalInteractionController.h; sourceTree = ""; }; + 8E8CBA03245CE3B5C11D88D402467BE7 /* NSBundle+NYTPhotoViewer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NSBundle+NYTPhotoViewer.m"; sourceTree = ""; }; 9017344DB0E0D91029C98D909F46601D /* OCMExpectationRecorder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMExpectationRecorder.m; path = Source/OCMock/OCMExpectationRecorder.m; sourceTree = ""; }; - 91A07D254746A5ED4897215F2F9F45AE /* NYTPhotoViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoViewController.m; sourceTree = ""; }; 92C4B5E15B42999732406D11FF27399E /* OCMBlockArgCaller.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMBlockArgCaller.m; path = Source/OCMock/OCMBlockArgCaller.m; sourceTree = ""; }; 93D8259D40CEC85A11AF991C76F56038 /* NSInvocation+OCMAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSInvocation+OCMAdditions.m"; path = "Source/OCMock/NSInvocation+OCMAdditions.m"; sourceTree = ""; }; 948A3B62EDB951814603C583A1DE14A9 /* Pods-NYTPhotoViewer-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-NYTPhotoViewer-acknowledgements.markdown"; sourceTree = ""; }; @@ -313,73 +316,65 @@ 9D1F8DFB3B198B389EEB6275D77F16BE /* OCMVerifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMVerifier.m; path = Source/OCMock/OCMVerifier.m; sourceTree = ""; }; 9DAC8D51213FAA234214456EDBC9156A /* Pods-Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Tests-resources.sh"; sourceTree = ""; }; A118FA0DF9EDA4523D44E32EBD8B46DE /* OCObserverMockObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCObserverMockObject.h; path = Source/OCMock/OCObserverMockObject.h; sourceTree = ""; }; - A26EEBF79D1FCEAB9FC8B48D54FA3E92 /* NYTPhotoContainer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotoContainer.h; sourceTree = ""; }; A4AEE7E7536BA5005C87B09A47B8D2BA /* OCMLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMLocation.h; path = Source/OCMock/OCMLocation.h; sourceTree = ""; }; A4BEB6AAF8E89B3D88516B5143A282CF /* NSValue+OCMAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSValue+OCMAdditions.m"; path = "Source/OCMock/NSValue+OCMAdditions.m"; sourceTree = ""; }; A4BECE0B52B507FC5D0F43DF23BA8237 /* libPods-NYTPhotoViewer-SwiftTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-NYTPhotoViewer-SwiftTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + A57B0D2B7A37D7FF6C68F57A2100B921 /* NYTPhotoContainer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotoContainer.h; sourceTree = ""; }; + A96A27F7E8595C88C9531E7CF754A42C /* NYTPhotoViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoViewController.m; sourceTree = ""; }; A9A8A71E9B0A1271A4EDDE402221428C /* OCMBoxedReturnValueProvider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMBoxedReturnValueProvider.h; path = Source/OCMock/OCMBoxedReturnValueProvider.h; sourceTree = ""; }; A9D76DC181FFA24CA772C83CC5998F99 /* NSMethodSignature+OCMAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMethodSignature+OCMAdditions.h"; path = "Source/OCMock/NSMethodSignature+OCMAdditions.h"; sourceTree = ""; }; ABA9A2401DD6B78C19450E4B5317EAFC /* OCProtocolMockObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCProtocolMockObject.h; path = Source/OCMock/OCProtocolMockObject.h; sourceTree = ""; }; ADAE12538446AEDF3DE9593F2108322B /* OCMFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMFunctions.m; path = Source/OCMock/OCMFunctions.m; sourceTree = ""; }; AE233E1358E9DF0B8481BF8111C483A6 /* Pods-NYTPhotoViewer-SwiftTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-NYTPhotoViewer-SwiftTests.release.xcconfig"; sourceTree = ""; }; - AF44970518DE4EC399BCB7CF344B15CF /* NYTPhotosViewControllerDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotosViewControllerDataSource.h; sourceTree = ""; }; - AF80F505D7D8D097B6E56BAEF73C872A /* NYTPhotoViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotoViewController.h; sourceTree = ""; }; B271D7914F3BBE18B22AB38342AF3803 /* NYTPhotoViewerCloseButtonXLandscape@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "NYTPhotoViewerCloseButtonXLandscape@3x.png"; sourceTree = ""; }; B304EE4E3C9C59C6AC5562290B8E54A0 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; }; B3A7959AAF13C4513F0A26907B05BE38 /* OCMConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMConstraint.h; path = Source/OCMock/OCMConstraint.h; sourceTree = ""; }; B3B003557BF43DD28224CCE9641279E9 /* Pods-NYTPhotoViewer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-NYTPhotoViewer.release.xcconfig"; sourceTree = ""; }; + B524782070F7E5AAE04AD5FB9C2F7FF1 /* FLAnimatedImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FLAnimatedImage-prefix.pch"; sourceTree = ""; }; B5BA50A06BFCCE49101A4EA9DB780838 /* OCMMacroState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMMacroState.m; path = Source/OCMock/OCMMacroState.m; sourceTree = ""; }; B6520FC9FA7ACAF05FFA2A104D7BC74A /* OCMRecorder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMRecorder.m; path = Source/OCMock/OCMRecorder.m; sourceTree = ""; }; + B752F47FD8479CA6FDE16B864DFE3BD6 /* FLAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FLAnimatedImageView.m; path = FLAnimatedImage/FLAnimatedImageView.m; sourceTree = ""; }; B79803237D0CE63E235B8BB3964A0726 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; B93F8B7A137359AEDBB2E532A9149D45 /* Pods-NYTPhotoViewer-SwiftTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-NYTPhotoViewer-SwiftTests-acknowledgements.plist"; sourceTree = ""; }; - B94C357DAD56E2A6961073E46E0B35DA /* NYTScalingImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTScalingImageView.m; sourceTree = ""; }; BA524E8CF14D5471E24EFF88FAE2E7A4 /* Pods-Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Tests-frameworks.sh"; sourceTree = ""; }; + BA5D458ED36671F4746AEABDAED29C17 /* FLAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FLAnimatedImageView.h; path = FLAnimatedImage/FLAnimatedImageView.h; sourceTree = ""; }; BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; BC0C50397B5BE45862226C08BEE972A9 /* OCMStubRecorder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMStubRecorder.h; path = Source/OCMock/OCMStubRecorder.h; sourceTree = ""; }; BFEFEBEFC9AC34B6DBF92B2945966247 /* OCMRealObjectForwarder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMRealObjectForwarder.m; path = Source/OCMock/OCMRealObjectForwarder.m; sourceTree = ""; }; + C21AE0BF51688EC33F3530295270954C /* NYTPhotosDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTPhotosDataSource.m; sourceTree = ""; }; C2E66F0C5763D1D42B63369B433D1180 /* OCPartialMockObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCPartialMockObject.h; path = Source/OCMock/OCPartialMockObject.h; sourceTree = ""; }; C3E9A885D5E9DA77276661C525199CD9 /* NYTPhotoViewerCloseButtonX.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = NYTPhotoViewerCloseButtonX.png; sourceTree = ""; }; - CDF977ECCBAF9FDD4516B23027E3BEE4 /* NYTPhotoTransitionController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoTransitionController.m; sourceTree = ""; }; - CE2F8A707A81C6B5DBE56FDC7F49C991 /* FLAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FLAnimatedImageView.h; path = FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImageView.h; sourceTree = ""; }; CEBC85ECBD828DF92AC9EEB8B18DA6F1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - CF7026F7B5DE65B3D2726E1E29E4A104 /* FLAnimatedImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FLAnimatedImage-prefix.pch"; sourceTree = ""; }; CFB26DA0397EDEC97F9223686DCAA7D3 /* OCMNotificationPoster.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMNotificationPoster.h; path = Source/OCMock/OCMNotificationPoster.h; sourceTree = ""; }; + D0A9BF394870352693A8F730E148574B /* NYTPhotoDismissalInteractionController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoDismissalInteractionController.m; sourceTree = ""; }; D2F9528FC984AA1AC37E0C37A193A06E /* OCProtocolMockObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCProtocolMockObject.m; path = Source/OCMock/OCProtocolMockObject.m; sourceTree = ""; }; D30281F94F4C6A8CADB1829C32CBE143 /* OCMPassByRefSetter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMPassByRefSetter.m; path = Source/OCMock/OCMPassByRefSetter.m; sourceTree = ""; }; D6506560499D9CF41A49EE06AD59D906 /* OCMIndirectReturnValueProvider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMIndirectReturnValueProvider.m; path = Source/OCMock/OCMIndirectReturnValueProvider.m; sourceTree = ""; }; - D9B67330FFC89B83812990971C70910A /* NSBundle+NYTPhotoViewer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NSBundle+NYTPhotoViewer.h"; sourceTree = ""; }; DC347E4D58FA4006D0DB039E114C4197 /* OCMExpectationRecorder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMExpectationRecorder.h; path = Source/OCMock/OCMExpectationRecorder.h; sourceTree = ""; }; DC68FF1EB094A7C50E5148DD123CC50C /* Pods-NYTPhotoViewer-Swift-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-NYTPhotoViewer-Swift-acknowledgements.markdown"; sourceTree = ""; }; DCC3DA2F14023E384CDB88FA771B7376 /* Pods-NYTPhotoViewer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-NYTPhotoViewer-dummy.m"; sourceTree = ""; }; DD187050710D5E8A4CDB3707A2489C37 /* OCMock-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "OCMock-prefix.pch"; sourceTree = ""; }; DDA5DD2854CFED7FF011EE6A9A4DCB4D /* OCMObserverRecorder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCMObserverRecorder.m; path = Source/OCMock/OCMObserverRecorder.m; sourceTree = ""; }; + DFD7649EA2AC00E2DA8E2B447ABE63A7 /* FLAnimatedImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FLAnimatedImage-dummy.m"; sourceTree = ""; }; DFEE15C59F74D39729145BD29145FE5E /* OCMIndirectReturnValueProvider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMIndirectReturnValueProvider.h; path = Source/OCMock/OCMIndirectReturnValueProvider.h; sourceTree = ""; }; - E5AE1D31BEB78C46CEEBD9A2E42D279C /* FLAnimatedImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FLAnimatedImage.h; path = FLAnimatedImageDemo/FLAnimatedImage/FLAnimatedImage.h; sourceTree = ""; }; E6E09C6F8F457DEBE5871EECECA22A0A /* OCMArg.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMArg.h; path = Source/OCMock/OCMArg.h; sourceTree = ""; }; - E70E5A6DAE02362043E6C3A42B17144B /* NYTPhotosOverlayView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = NYTPhotosOverlayView.m; sourceTree = ""; }; E918988881A1DC5DD9C73611C699B5EF /* NSObject+OCMAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+OCMAdditions.h"; path = "Source/OCMock/NSObject+OCMAdditions.h"; sourceTree = ""; }; E9218905F90589519D5C9E501403FD5F /* NSMethodSignature+OCMAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMethodSignature+OCMAdditions.m"; path = "Source/OCMock/NSMethodSignature+OCMAdditions.m"; sourceTree = ""; }; E93CEF5802DA5A4170AC4E23CDEBE484 /* Pods-NYTPhotoViewer-SwiftTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-NYTPhotoViewer-SwiftTests-frameworks.sh"; sourceTree = ""; }; EA8E1E7CEE735DA4896915A276D1BC40 /* OCMMacroState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMMacroState.h; path = Source/OCMock/OCMMacroState.h; sourceTree = ""; }; + EE9C5F374B788B38F7577CBACD6374D1 /* NSBundle+NYTPhotoViewer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NSBundle+NYTPhotoViewer.h"; sourceTree = ""; }; F170EA151A6B5BB3B1185891240455B8 /* OCMVerifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMVerifier.h; path = Source/OCMock/OCMVerifier.h; sourceTree = ""; }; + F272208CEBC0979AF3E0744A2F82FDC8 /* NYTPhoto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhoto.h; sourceTree = ""; }; F6A90C123A977A38E68A560A4D79D195 /* Pods-Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Tests.debug.xcconfig"; sourceTree = ""; }; F6FA1A0F53B04EA6E8303A635D478550 /* NYTPhotoViewer.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NYTPhotoViewer.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; F702EA88D0926BE8D736994211CD85F8 /* Pods-NYTPhotoViewer-Swift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-NYTPhotoViewer-Swift-dummy.m"; sourceTree = ""; }; F95176C5920DC50D4337C850A2F982E4 /* OCMInvocationExpectation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCMInvocationExpectation.h; path = Source/OCMock/OCMInvocationExpectation.h; sourceTree = ""; }; - FC428DB0728D3C890A048936FF11D546 /* NYTPhotosDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = NYTPhotosDataSource.h; sourceTree = ""; }; FD13B7465741BF44542D9908F4282CF2 /* libOCMock.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libOCMock.a; sourceTree = BUILT_PRODUCTS_DIR; }; FDC2EB857342A0F7825BAA82E87A03E3 /* OCClassMockObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OCClassMockObject.h; path = Source/OCMock/OCClassMockObject.h; sourceTree = ""; }; FDC947C2C4A736687249A5D97209C29B /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 0ACCBF5CE2EE0325993250A8020E5AF3 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 0C611D7687D01E1FA4FDA3E0C852D0DC /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -416,6 +411,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + A46A250F4E59B08EB59C1BE4213E177D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 422CC40CE7C1DAE6334D28111C10491C /* Foundation.framework in Frameworks */, + 60225E43F29FDCDDA5C106FEFADEF076 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AECF13C7DBD49E813612E6011040B9B7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -432,18 +436,28 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - D586518716CCCB0B7446795AEBBD24C6 /* Frameworks */ = { + E6E6CC792423E601DC7309CE925CCDB4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 344846C012B1957DB0E2A25B619E875E /* Foundation.framework in Frameworks */, - B657A5BB60555A640B56D1CAF4844E1C /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 01A3ADA8F016D32E66E67FA792A40BCB /* FLAnimatedImage */ = { + isa = PBXGroup; + children = ( + 1777FBF7AB53EABE912D85E7E0556670 /* FLAnimatedImage.h */, + 0302D606627AFF213D39DE2877B4638D /* FLAnimatedImage.m */, + BA5D458ED36671F4746AEABDAED29C17 /* FLAnimatedImageView.h */, + B752F47FD8479CA6FDE16B864DFE3BD6 /* FLAnimatedImageView.m */, + F8E29B0BB06C0374E576523ACBFBF9DF /* Support Files */, + ); + path = FLAnimatedImage; + sourceTree = ""; + }; 0494C12ED3792622EF6FABAEAD544E29 /* Assets */ = { isa = PBXGroup; children = ( @@ -460,15 +474,6 @@ path = Pod; sourceTree = ""; }; - 0DD52FC92DA9DFBCAA7EEEBF073B4AEF /* Resource Loading */ = { - isa = PBXGroup; - children = ( - D9B67330FFC89B83812990971C70910A /* NSBundle+NYTPhotoViewer.h */, - 68E7E36B7D1E70CD7E887B412BBF762F /* NSBundle+NYTPhotoViewer.m */, - ); - path = "Resource Loading"; - sourceTree = ""; - }; 0F75DF6C7C5F002280EC53F48E80B587 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -477,16 +482,31 @@ name = Frameworks; sourceTree = ""; }; - 15259B77C7E6FBDFAF363D661B773FA9 /* FLAnimatedImage */ = { + 0FCAFE0FDC5B4823AAF5C70FC8BA1EE6 /* ios */ = { isa = PBXGroup; children = ( - E5AE1D31BEB78C46CEEBD9A2E42D279C /* FLAnimatedImage.h */, - 620B31E6A0622F4890F7870EF5FC6EEB /* FLAnimatedImage.m */, - CE2F8A707A81C6B5DBE56FDC7F49C991 /* FLAnimatedImageView.h */, - 3F8F34E433F8134AF7BD460EACB9D4AF /* FLAnimatedImageView.m */, - C9A873FDED30E7AE8FD931BD40F0CBE7 /* Support Files */, + 1781D669D30BF31E3D30458C11401EC4 /* NYTPhotoCaptionView.h */, + 52A46719EDEA6919CB7CE89CEA7D170B /* NYTPhotoCaptionView.m */, + 8E251763ABC4628F9FD370376C62339C /* NYTPhotoDismissalInteractionController.h */, + D0A9BF394870352693A8F730E148574B /* NYTPhotoDismissalInteractionController.m */, + 0E09EDD8693DA4EAB1AA460341C04088 /* NYTPhotosDataSource.h */, + C21AE0BF51688EC33F3530295270954C /* NYTPhotosDataSource.m */, + 68CB521D81490E919F4C67BF5766A8A0 /* NYTPhotosOverlayView.h */, + 35B1FDF843FF7681C271B1B8B6B2C88D /* NYTPhotosOverlayView.m */, + 2D275C43CB9D76E11C8D859651EE5D49 /* NYTPhotosViewController.h */, + 7BFA570C0B1F268736D9A57B61FC5AC0 /* NYTPhotosViewController.m */, + 2491FAB95107BC50DD0CF5CC6146FD13 /* NYTPhotoTransitionAnimator.h */, + 2E3CA746E4CF52E8A7372029183A6E69 /* NYTPhotoTransitionAnimator.m */, + 8D998033226514D2EC165F848A5C8C25 /* NYTPhotoTransitionController.h */, + 6E0C66159C5486540FCCAE67BEA34892 /* NYTPhotoTransitionController.m */, + 04B574365EAB5934994AE69CFBDAD936 /* NYTPhotoViewController.h */, + A96A27F7E8595C88C9531E7CF754A42C /* NYTPhotoViewController.m */, + 2DC9C91E71106B35175DE328DCDCA7AA /* NYTScalingImageView.h */, + 0EB8C9AB20B04C92ADD97EF8A5693AC4 /* NYTScalingImageView.m */, + 4903835AD22870ADA1EAF7623C603D7A /* Protocols */, + 98ABCDB7C2B90BD0A83B715DFC4F47CD /* Resource Loading */, ); - path = FLAnimatedImage; + path = ios; sourceTree = ""; }; 29BE1818C624D9007E5AFFC9F6FE671A /* iOS */ = { @@ -604,6 +624,17 @@ name = Products; sourceTree = ""; }; + 4903835AD22870ADA1EAF7623C603D7A /* Protocols */ = { + isa = PBXGroup; + children = ( + F272208CEBC0979AF3E0744A2F82FDC8 /* NYTPhoto.h */, + 2891A0D8A07EB10D5EA116698072DFAA /* NYTPhotoCaptionViewLayoutWidthHinting.h */, + A57B0D2B7A37D7FF6C68F57A2100B921 /* NYTPhotoContainer.h */, + 841176779F5748D4E85904F14BBAAF32 /* NYTPhotosViewControllerDataSource.h */, + ); + path = Protocols; + sourceTree = ""; + }; 5394121ADFB9CE278EBA719F97A3CCCF /* Resources */ = { isa = PBXGroup; children = ( @@ -625,20 +656,10 @@ path = ios; sourceTree = ""; }; - 6BADE8B421FB5DA9E26CC9F18289EE4E /* Protocols */ = { - isa = PBXGroup; - children = ( - 16627F33953921BDE35AD99AC4B16D9B /* NYTPhoto.h */, - A26EEBF79D1FCEAB9FC8B48D54FA3E92 /* NYTPhotoContainer.h */, - AF44970518DE4EC399BCB7CF344B15CF /* NYTPhotosViewControllerDataSource.h */, - ); - path = Protocols; - sourceTree = ""; - }; 6CCCB7EE7DEB24F5527EEAB4189D4A22 /* Pods */ = { isa = PBXGroup; children = ( - 15259B77C7E6FBDFAF363D661B773FA9 /* FLAnimatedImage */, + 01A3ADA8F016D32E66E67FA792A40BCB /* FLAnimatedImage */, 35AB59F91552C0C718B083B7648F7186 /* OCMock */, ); name = Pods; @@ -669,7 +690,7 @@ 7579AAE3966C3DC191583C98AA5CBA0B /* Classes */ = { isa = PBXGroup; children = ( - DE8A3C52A54AF50F7DFB2CFD946DFA20 /* ios */, + 0FCAFE0FDC5B4823AAF5C70FC8BA1EE6 /* ios */, ); path = Classes; sourceTree = ""; @@ -726,6 +747,15 @@ path = Pod; sourceTree = ""; }; + 98ABCDB7C2B90BD0A83B715DFC4F47CD /* Resource Loading */ = { + isa = PBXGroup; + children = ( + EE9C5F374B788B38F7577CBACD6374D1 /* NSBundle+NYTPhotoViewer.h */, + 8E8CBA03245CE3B5C11D88D402467BE7 /* NSBundle+NYTPhotoViewer.m */, + ); + path = "Resource Loading"; + sourceTree = ""; + }; B9E75F7F9BE6950522EF5E5D0A3991CE /* Pods-NYTPhotoViewer-SwiftTests */ = { isa = PBXGroup; children = ( @@ -756,17 +786,6 @@ path = "Target Support Files/Pods-NYTPhotoViewer-Swift"; sourceTree = ""; }; - C9A873FDED30E7AE8FD931BD40F0CBE7 /* Support Files */ = { - isa = PBXGroup; - children = ( - 1137C13C6691991C91192964662F6FAC /* FLAnimatedImage.xcconfig */, - 3E74F9B493212A5CA4B95EF7B6DBCB85 /* FLAnimatedImage-dummy.m */, - CF7026F7B5DE65B3D2726E1E29E4A104 /* FLAnimatedImage-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/FLAnimatedImage"; - sourceTree = ""; - }; D25566FE898566522AFA119445F00A65 /* NYTPhotoViewer */ = { isa = PBXGroup; children = ( @@ -792,31 +811,15 @@ path = "Target Support Files/Pods-Tests"; sourceTree = ""; }; - DE8A3C52A54AF50F7DFB2CFD946DFA20 /* ios */ = { + F8E29B0BB06C0374E576523ACBFBF9DF /* Support Files */ = { isa = PBXGroup; children = ( - 0CEC2EB950AAEA9853DC4BE18841D0E5 /* NYTPhotoCaptionView.h */, - 2FFE41789EE2840CC61D013E67C3EF16 /* NYTPhotoCaptionView.m */, - 1344C3852BE41C102B5E191610B89DC5 /* NYTPhotoDismissalInteractionController.h */, - 87D64424FB9810772D6B77C600019B90 /* NYTPhotoDismissalInteractionController.m */, - FC428DB0728D3C890A048936FF11D546 /* NYTPhotosDataSource.h */, - 4C09E9749B656F6F7F9316A81EA01C06 /* NYTPhotosDataSource.m */, - 8D8F7644580B335B9EEA76DB6DE65603 /* NYTPhotosOverlayView.h */, - E70E5A6DAE02362043E6C3A42B17144B /* NYTPhotosOverlayView.m */, - 3F1AF8DD08D62A5BDD9BC5313F8DE607 /* NYTPhotosViewController.h */, - 3995EDD5E49FC0C2C90FD250DE83382D /* NYTPhotosViewController.m */, - 69F8308B753FD31BC37C6B25536F2140 /* NYTPhotoTransitionAnimator.h */, - 36E29385C5DAB9E9FD449AFD8D00E088 /* NYTPhotoTransitionAnimator.m */, - 7E3143757CF12CCB20A3A293D1C4A376 /* NYTPhotoTransitionController.h */, - CDF977ECCBAF9FDD4516B23027E3BEE4 /* NYTPhotoTransitionController.m */, - AF80F505D7D8D097B6E56BAEF73C872A /* NYTPhotoViewController.h */, - 91A07D254746A5ED4897215F2F9F45AE /* NYTPhotoViewController.m */, - 3C1BD56355078ED0311DA2E365268202 /* NYTScalingImageView.h */, - B94C357DAD56E2A6961073E46E0B35DA /* NYTScalingImageView.m */, - 6BADE8B421FB5DA9E26CC9F18289EE4E /* Protocols */, - 0DD52FC92DA9DFBCAA7EEEBF073B4AEF /* Resource Loading */, + 06692780E124290FDB6556C283DCEEAD /* FLAnimatedImage.xcconfig */, + DFD7649EA2AC00E2DA8E2B447ABE63A7 /* FLAnimatedImage-dummy.m */, + B524782070F7E5AAE04AD5FB9C2F7FF1 /* FLAnimatedImage-prefix.pch */, ); - path = ios; + name = "Support Files"; + path = "../Target Support Files/FLAnimatedImage"; sourceTree = ""; }; /* End PBXGroup section */ @@ -864,23 +867,24 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - B1D4808049A8DBFBD94C1806CC0C80A7 /* Headers */ = { + F23549DBE3534324F97B22486C8BCFEE /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 559A00371C2A2DE88312C5DFB729FA81 /* NSBundle+NYTPhotoViewer.h in Headers */, - CCA2FEDC4ED916CB5EC825D1AF89F57A /* NYTPhoto.h in Headers */, - 06B521E7788C0D7EEEE5442C70DC4C6D /* NYTPhotoCaptionView.h in Headers */, - 42FC45651FEB8FE1A9E4736040CB7B0E /* NYTPhotoContainer.h in Headers */, - 581C67FF2A8524E1DAA2DBE038F385C9 /* NYTPhotoDismissalInteractionController.h in Headers */, - 6CCBE8AA3641BC16165C2978C7909B58 /* NYTPhotosDataSource.h in Headers */, - DED547A2EE62709BFCF833CB152D9F66 /* NYTPhotosOverlayView.h in Headers */, - 04AF9593455148EB5B9A43882B8BDBDA /* NYTPhotosViewController.h in Headers */, - D7157508A3553D7A221A5BC03CF923D7 /* NYTPhotosViewControllerDataSource.h in Headers */, - 3A950D10507DE1B3D9F455947577C8E1 /* NYTPhotoTransitionAnimator.h in Headers */, - DD4C56F24DC87BF889ABE78AE427358E /* NYTPhotoTransitionController.h in Headers */, - 333AE4B612DC5F563B6F7412D761FAE9 /* NYTPhotoViewController.h in Headers */, - 0D9F93D0B730EA7DB676F474C1611FC6 /* NYTScalingImageView.h in Headers */, + 96AA6CBA703C2690A707AF3E9099032C /* NSBundle+NYTPhotoViewer.h in Headers */, + 2B20322155F43A8B6132E72BDB3DB723 /* NYTPhoto.h in Headers */, + C624AEA7F64F268ECC7A636D0B118185 /* NYTPhotoCaptionView.h in Headers */, + FBB048FC0930D06D3946FF941CFDF555 /* NYTPhotoCaptionViewLayoutWidthHinting.h in Headers */, + 25EBFE1A355E5270C8C4E886D6FA1A6D /* NYTPhotoContainer.h in Headers */, + FF89D64A56347C235B8A081539AF9DD2 /* NYTPhotoDismissalInteractionController.h in Headers */, + 55FA6B09D105DEDDB1AAACFD6FF69B4D /* NYTPhotosDataSource.h in Headers */, + 183C8BCE6A8A8CA5FE2853FA7A16752A /* NYTPhotosOverlayView.h in Headers */, + B466ACC84DEB3B813EDBFFEC95760AB3 /* NYTPhotosViewController.h in Headers */, + 8AD3CBF5EFD13418B67B7DBD7673CE9C /* NYTPhotosViewControllerDataSource.h in Headers */, + C21FA017A42E8B1CA9CC3F9C1F88318F /* NYTPhotoTransitionAnimator.h in Headers */, + 71CFED44C6B6DFC86B8DFCC574F6B8E4 /* NYTPhotoTransitionController.h in Headers */, + D0487B97CDAE11C119336FD22A1B09DE /* NYTPhotoViewController.h in Headers */, + B184CBA7492201A7F61468F027FFBE7F /* NYTScalingImageView.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -888,14 +892,33 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 2DBEC7BF142147EC2EB66E9428444670 /* FLAnimatedImage.h in Headers */, - F5872852E80C246A0B2FC6DBCD6A1633 /* FLAnimatedImageView.h in Headers */, + FB423EE72C2A6D0ED5DEFBEE9BE80A98 /* FLAnimatedImage.h in Headers */, + 7AE83DFAD9756ED1FB1CB5E36F9CF6EB /* FLAnimatedImageView.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 0654143889A23F99F0114BE527E8E3B0 /* NYTPhotoViewer */ = { + isa = PBXNativeTarget; + buildConfigurationList = B0D4D8F6CF2CEDD35DA8E8FC4C015333 /* Build configuration list for PBXNativeTarget "NYTPhotoViewer" */; + buildPhases = ( + E744386E858798AB168DEB7FFE0F402B /* Sources */, + A46A250F4E59B08EB59C1BE4213E177D /* Frameworks */, + F23549DBE3534324F97B22486C8BCFEE /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + D7489D389BC01C9D2AA530DEA50E329A /* PBXTargetDependency */, + 31BC5076397C7BEB13B71089484A96A1 /* PBXTargetDependency */, + ); + name = NYTPhotoViewer; + productName = NYTPhotoViewer; + productReference = 3312F3BB9EB529E361D7557F11720647 /* libNYTPhotoViewer.a */; + productType = "com.apple.product-type.library.static"; + }; 1A79BA86DB198181905CBBFC1F1E6701 /* FLAnimatedImage */ = { isa = PBXNativeTarget; buildConfigurationList = 7CCD7F601F55B0AB6E88DCCFF6374DB5 /* Build configuration list for PBXNativeTarget "FLAnimatedImage" */; @@ -949,6 +972,23 @@ productReference = A4BECE0B52B507FC5D0F43DF23BA8237 /* libPods-NYTPhotoViewer-SwiftTests.a */; productType = "com.apple.product-type.library.static"; }; + 693C39C58B0B71A71225DDAE17874B3E /* NYTPhotoViewer-NYTPhotoViewer */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6F99B716F6784ADB4556CCEAA5AB70D0 /* Build configuration list for PBXNativeTarget "NYTPhotoViewer-NYTPhotoViewer" */; + buildPhases = ( + 2ED3683AD0DB5D88561A03E902734398 /* Sources */, + E6E6CC792423E601DC7309CE925CCDB4 /* Frameworks */, + D86907F91BF80A6AB6CF7AC9A33BDFD7 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "NYTPhotoViewer-NYTPhotoViewer"; + productName = "NYTPhotoViewer-NYTPhotoViewer"; + productReference = F6FA1A0F53B04EA6E8303A635D478550 /* NYTPhotoViewer.bundle */; + productType = "com.apple.product-type.bundle"; + }; 81E5D24E494205A86E10315A97453C99 /* Pods-Tests */ = { isa = PBXNativeTarget; buildConfigurationList = 35203008B3F488CFD36CF8BB6AAE7111 /* Build configuration list for PBXNativeTarget "Pods-Tests" */; @@ -968,23 +1008,6 @@ productReference = 6D72CFFCA56C168C0A7FE7F810A4B3C4 /* libPods-Tests.a */; productType = "com.apple.product-type.library.static"; }; - BAF9C6775FDBB0362A663E43AD7E2078 /* NYTPhotoViewer-NYTPhotoViewer */ = { - isa = PBXNativeTarget; - buildConfigurationList = 6036E348A4C8A9BA7469EC8F37C46A35 /* Build configuration list for PBXNativeTarget "NYTPhotoViewer-NYTPhotoViewer" */; - buildPhases = ( - ACF160415C01EB7DD5A58547A83C3B3C /* Sources */, - 0ACCBF5CE2EE0325993250A8020E5AF3 /* Frameworks */, - B1F465A81DC8A210516034E770CA4B21 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "NYTPhotoViewer-NYTPhotoViewer"; - productName = "NYTPhotoViewer-NYTPhotoViewer"; - productReference = F6FA1A0F53B04EA6E8303A635D478550 /* NYTPhotoViewer.bundle */; - productType = "com.apple.product-type.bundle"; - }; D5EC63626395827D8EF17AB0C18757B9 /* Pods-NYTPhotoViewer-Swift */ = { isa = PBXNativeTarget; buildConfigurationList = 9FA78F271AF31B39FEE4CF4A32EC4D2F /* Build configuration list for PBXNativeTarget "Pods-NYTPhotoViewer-Swift" */; @@ -1021,25 +1044,6 @@ productReference = 3529BF22431013E7BB6E418B1F38256E /* libPods-NYTPhotoViewer.a */; productType = "com.apple.product-type.library.static"; }; - FD07CF7E0940CA0E837960FB607AAB32 /* NYTPhotoViewer */ = { - isa = PBXNativeTarget; - buildConfigurationList = AD9E12A71BE759218DCC7B41CDEC9E5B /* Build configuration list for PBXNativeTarget "NYTPhotoViewer" */; - buildPhases = ( - F921EB46255EF7E1EB66A2087690A1D5 /* Sources */, - D586518716CCCB0B7446795AEBBD24C6 /* Frameworks */, - B1D4808049A8DBFBD94C1806CC0C80A7 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - C2B191301AF6E0DBB06FE4605CAED9FC /* PBXTargetDependency */, - 5533FC61AB71F89CD5B5194B19BA0C80 /* PBXTargetDependency */, - ); - name = NYTPhotoViewer; - productName = NYTPhotoViewer; - productReference = 3312F3BB9EB529E361D7557F11720647 /* libNYTPhotoViewer.a */; - productType = "com.apple.product-type.library.static"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -1062,8 +1066,8 @@ projectRoot = ""; targets = ( 1A79BA86DB198181905CBBFC1F1E6701 /* FLAnimatedImage */, - FD07CF7E0940CA0E837960FB607AAB32 /* NYTPhotoViewer */, - BAF9C6775FDBB0362A663E43AD7E2078 /* NYTPhotoViewer-NYTPhotoViewer */, + 0654143889A23F99F0114BE527E8E3B0 /* NYTPhotoViewer */, + 693C39C58B0B71A71225DDAE17874B3E /* NYTPhotoViewer-NYTPhotoViewer */, 4A2CAA839F2722C796C6F1DFDC806B92 /* OCMock */, EFE62BE19C543E2DA91B619D846E57E4 /* Pods-NYTPhotoViewer */, D5EC63626395827D8EF17AB0C18757B9 /* Pods-NYTPhotoViewer-Swift */, @@ -1074,16 +1078,16 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - B1F465A81DC8A210516034E770CA4B21 /* Resources */ = { + D86907F91BF80A6AB6CF7AC9A33BDFD7 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5C49C7BE23104E4833DFF09CDE38F87D /* NYTPhotoViewerCloseButtonX.png in Resources */, - 159381411E3F55FD8055347BDCF1E0BD /* NYTPhotoViewerCloseButtonX@2x.png in Resources */, - 3F494A3C6381E738036DBF57755839C5 /* NYTPhotoViewerCloseButtonX@3x.png in Resources */, - B2FEB00BCB5AAD8D5030F7A8017630AC /* NYTPhotoViewerCloseButtonXLandscape.png in Resources */, - A5CA2F907A3B997DADDC7FCE44F56F25 /* NYTPhotoViewerCloseButtonXLandscape@2x.png in Resources */, - 3E8D7F08501841947BD13B51EC8B449B /* NYTPhotoViewerCloseButtonXLandscape@3x.png in Resources */, + B0E05562A115CEC19523EC0337D4391A /* NYTPhotoViewerCloseButtonX.png in Resources */, + 9A4FD7CA85278E4080D9567479369546 /* NYTPhotoViewerCloseButtonX@2x.png in Resources */, + 0DECD374B59611D4E32BD5EF406679F1 /* NYTPhotoViewerCloseButtonX@3x.png in Resources */, + D21CCD2E0296D920702D681D6B74F877 /* NYTPhotoViewerCloseButtonXLandscape.png in Resources */, + 8AEFADC427762A8A3071EC11B058E560 /* NYTPhotoViewerCloseButtonXLandscape@2x.png in Resources */, + 14EA64C0FC85C40F7CC6B35835F44F60 /* NYTPhotoViewerCloseButtonXLandscape@3x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1098,6 +1102,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 2ED3683AD0DB5D88561A03E902734398 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 33CF95FAFC48226F1A54C85AA1529B40 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1155,20 +1166,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - ACF160415C01EB7DD5A58547A83C3B3C /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; BA051833E256E1799D7759FE76438EDC /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 3D258E9A843C52C991E5E9455CB8DB51 /* FLAnimatedImage-dummy.m in Sources */, - AB5E80218B841C79963B69C7FB5B6378 /* FLAnimatedImage.m in Sources */, - F82338CC3F882FAA29C161219E124753 /* FLAnimatedImageView.m in Sources */, + E99CE64289F5FDD09B7E1188379AED41 /* FLAnimatedImage.m in Sources */, + B3AA789E74DBAB167DAD0FDCA19690C7 /* FLAnimatedImageView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1180,31 +1184,37 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F921EB46255EF7E1EB66A2087690A1D5 /* Sources */ = { + E744386E858798AB168DEB7FFE0F402B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C16820E10B6EFB7D2EF419A18BECD7A1 /* NSBundle+NYTPhotoViewer.m in Sources */, - 7135CB1BBF84158EC60C90536AD92FC8 /* NYTPhotoCaptionView.m in Sources */, - 3B2AC9E7E7289DC9D55623A383EC36EF /* NYTPhotoDismissalInteractionController.m in Sources */, - 31FC31B5B5D90FFFD22E7D18E892AB27 /* NYTPhotosDataSource.m in Sources */, - 71376B0D4095727E05901F2787086880 /* NYTPhotosOverlayView.m in Sources */, - 213ED3B0792A4D1510CAE75B41B05AFF /* NYTPhotosViewController.m in Sources */, - 860D30D1BB955B32A3A947C6154E417A /* NYTPhotoTransitionAnimator.m in Sources */, - A727B1CADD4A915906030B560F237124 /* NYTPhotoTransitionController.m in Sources */, - CBDB0E7C7E6663E42BAABC210A4E0744 /* NYTPhotoViewController.m in Sources */, - 26D65092A07D78DD295C75DCD5AFB1F2 /* NYTPhotoViewer-dummy.m in Sources */, - EEA564BB9C181F381481427368B805BA /* NYTScalingImageView.m in Sources */, + 7C7C91B0D616ADD86E208713A22419B9 /* NSBundle+NYTPhotoViewer.m in Sources */, + 3009A71CCDC3E0A261D1DEFD79F8531D /* NYTPhotoCaptionView.m in Sources */, + 6C10E812F3AFFCBD5062BD599E05499E /* NYTPhotoDismissalInteractionController.m in Sources */, + 1800397EDF43C932093838940EAAA045 /* NYTPhotosDataSource.m in Sources */, + 60244C06E35A0C05A6F3FB1694B95BBF /* NYTPhotosOverlayView.m in Sources */, + 21721F5FAF6C68D4B94C743FCDAEA790 /* NYTPhotosViewController.m in Sources */, + 8AEB5737F1DA5540B3BDB2DDCE2D7401 /* NYTPhotoTransitionAnimator.m in Sources */, + 97E7A55C33E1C7717A8BE961F6547D13 /* NYTPhotoTransitionController.m in Sources */, + 171F70710819BE87270EFA05924971F4 /* NYTPhotoViewController.m in Sources */, + E7B12EB9B2A6443B0FB6541B46DB1DB9 /* NYTPhotoViewer-dummy.m in Sources */, + 5030BA8BB5492165F062BD652988EBB4 /* NYTScalingImageView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 31BC5076397C7BEB13B71089484A96A1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "NYTPhotoViewer-NYTPhotoViewer"; + target = 693C39C58B0B71A71225DDAE17874B3E /* NYTPhotoViewer-NYTPhotoViewer */; + targetProxy = B6A43A6161806CE532F207A79B63D406 /* PBXContainerItemProxy */; + }; 3219572033880CF72398513AC64A51FF /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = NYTPhotoViewer; - target = FD07CF7E0940CA0E837960FB607AAB32 /* NYTPhotoViewer */; + target = 0654143889A23F99F0114BE527E8E3B0 /* NYTPhotoViewer */; targetProxy = 6172F0104FB64E5208B145ADFB627E62 /* PBXContainerItemProxy */; }; 4B1BAB42EE711E9C70D8E0C0F45A8A1D /* PBXTargetDependency */ = { @@ -1219,16 +1229,10 @@ target = 4A2CAA839F2722C796C6F1DFDC806B92 /* OCMock */; targetProxy = AF47FE2DB728285ED7B873C40660842C /* PBXContainerItemProxy */; }; - 5533FC61AB71F89CD5B5194B19BA0C80 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "NYTPhotoViewer-NYTPhotoViewer"; - target = BAF9C6775FDBB0362A663E43AD7E2078 /* NYTPhotoViewer-NYTPhotoViewer */; - targetProxy = A9CF70A82AE001498FB9F09811E4FE9B /* PBXContainerItemProxy */; - }; 745EE36F0DE70E60CBE2C3A7CFB7DA42 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = NYTPhotoViewer; - target = FD07CF7E0940CA0E837960FB607AAB32 /* NYTPhotoViewer */; + target = 0654143889A23F99F0114BE527E8E3B0 /* NYTPhotoViewer */; targetProxy = 360931A573BBF9BF7C08B40113A0FBBF /* PBXContainerItemProxy */; }; 7A39CD9C2F26219A3A8DB7C93DDC0069 /* PBXTargetDependency */ = { @@ -1240,15 +1244,9 @@ BAF41D24331E5C4394240DBE313CF81D /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = NYTPhotoViewer; - target = FD07CF7E0940CA0E837960FB607AAB32 /* NYTPhotoViewer */; + target = 0654143889A23F99F0114BE527E8E3B0 /* NYTPhotoViewer */; targetProxy = 7EBE4843A061104AB6084A9768B3499B /* PBXContainerItemProxy */; }; - C2B191301AF6E0DBB06FE4605CAED9FC /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = FLAnimatedImage; - target = 1A79BA86DB198181905CBBFC1F1E6701 /* FLAnimatedImage */; - targetProxy = 2D4A0D8C8330D3B6915B4A8090600D4D /* PBXContainerItemProxy */; - }; C8338E4C4E67A0141F4FEB65206DB1D8 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = FLAnimatedImage; @@ -1258,9 +1256,15 @@ D25F54C0D195B2D5EBF06CCE758091E3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = NYTPhotoViewer; - target = FD07CF7E0940CA0E837960FB607AAB32 /* NYTPhotoViewer */; + target = 0654143889A23F99F0114BE527E8E3B0 /* NYTPhotoViewer */; targetProxy = 51BA6C87CEFC9F55F8E5003AF5DBA923 /* PBXContainerItemProxy */; }; + D7489D389BC01C9D2AA530DEA50E329A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FLAnimatedImage; + target = 1A79BA86DB198181905CBBFC1F1E6701 /* FLAnimatedImage */; + targetProxy = AE3809356F577E09124E08D48D549B45 /* PBXContainerItemProxy */; + }; F612CF41881861976855AB16AD6C4118 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = FLAnimatedImage; @@ -1293,44 +1297,31 @@ }; name = Release; }; - 04B1C0307FAB8C7B952A76826F86192E /* Debug */ = { + 19F353D017640F72B53C16EB909BD2A3 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 064E1C219125C6C9038C857CA3BD6583 /* NYTPhotoViewer.xcconfig */; + baseConfigurationReference = F6A90C123A977A38E68A560A4D79D195 /* Pods-Tests.debug.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/NYTPhotoViewer/NYTPhotoViewer-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; + PODS_ROOT = "$(SRCROOT)"; PRODUCT_NAME = "$(TARGET_NAME)"; - PUBLIC_HEADERS_FOLDER_PATH = ""; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; name = Debug; }; - 07C7D422FBBC73EBCFFA19BF6DBBC16E /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 064E1C219125C6C9038C857CA3BD6583 /* NYTPhotoViewer.xcconfig */; - buildSettings = { - ENABLE_STRICT_OBJC_MSGSEND = YES; - PRODUCT_NAME = NYTPhotoViewer; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - 0FEB87075DCF9D6DC9C8D748F7CEE790 /* Release */ = { + 251121609363F57B20CE1485900386DF /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 064E1C219125C6C9038C857CA3BD6583 /* NYTPhotoViewer.xcconfig */; + baseConfigurationReference = 7B8337F919BD3F92A18BC349D5F01A8D /* OCMock.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/NYTPhotoViewer/NYTPhotoViewer-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/OCMock/OCMock-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRIVATE_HEADERS_FOLDER_PATH = ""; @@ -1339,16 +1330,16 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Release; + name = Debug; }; - 19F353D017640F72B53C16EB909BD2A3 /* Debug */ = { + 536A8F629DB6C1C1D9848977DC1AF06B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F6A90C123A977A38E68A560A4D79D195 /* Pods-Tests.debug.xcconfig */; + baseConfigurationReference = B3B003557BF43DD28224CCE9641279E9 /* Pods-NYTPhotoViewer.release.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; MACH_O_TYPE = staticlib; - MTL_ENABLE_DEBUG_INFO = YES; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -1356,16 +1347,16 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Debug; + name = Release; }; - 251121609363F57B20CE1485900386DF /* Debug */ = { + 5DAE9E1F9AE6FCC978975B2ECE991D13 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7B8337F919BD3F92A18BC349D5F01A8D /* OCMock.xcconfig */; + baseConfigurationReference = 064E1C219125C6C9038C857CA3BD6583 /* NYTPhotoViewer.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/OCMock/OCMock-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/NYTPhotoViewer/NYTPhotoViewer-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRIVATE_HEADERS_FOLDER_PATH = ""; @@ -1374,23 +1365,6 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Debug; - }; - 536A8F629DB6C1C1D9848977DC1AF06B /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B3B003557BF43DD28224CCE9641279E9 /* Pods-NYTPhotoViewer.release.xcconfig */; - buildSettings = { - ENABLE_STRICT_OBJC_MSGSEND = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACH_O_TYPE = staticlib; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - }; name = Release; }; 68672C51C711C5E16AC79EA5141170EA /* Release */ = { @@ -1503,7 +1477,7 @@ }; A8D9CB03E525E0E3B945931B1732B69A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1137C13C6691991C91192964662F6FAC /* FLAnimatedImage.xcconfig */; + baseConfigurationReference = 06692780E124290FDB6556C283DCEEAD /* FLAnimatedImage.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_PREFIX_HEADER = "Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch"; @@ -1521,7 +1495,7 @@ }; B14AF75C5CEF244B065304A03868A02D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1137C13C6691991C91192964662F6FAC /* FLAnimatedImage.xcconfig */; + baseConfigurationReference = 06692780E124290FDB6556C283DCEEAD /* FLAnimatedImage.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_PREFIX_HEADER = "Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch"; @@ -1554,34 +1528,40 @@ }; name = Debug; }; - DE4B7DA82DB9AAC0653F9810A7E4C03A /* Release */ = { + CF34DA6D14B42D7490C1758CBBA5355E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AE233E1358E9DF0B8481BF8111C483A6 /* Pods-NYTPhotoViewer-SwiftTests.release.xcconfig */; + baseConfigurationReference = 064E1C219125C6C9038C857CA3BD6583 /* NYTPhotoViewer.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/NYTPhotoViewer/NYTPhotoViewer-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACH_O_TYPE = staticlib; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; + PRIVATE_HEADERS_FOLDER_PATH = ""; PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Release; + name = Debug; }; - E46F045EB51E8BCBE8E69EF26C4114AE /* Debug */ = { + DE4B7DA82DB9AAC0653F9810A7E4C03A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 064E1C219125C6C9038C857CA3BD6583 /* NYTPhotoViewer.xcconfig */; + baseConfigurationReference = AE233E1358E9DF0B8481BF8111C483A6 /* Pods-NYTPhotoViewer-SwiftTests.release.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; - PRODUCT_NAME = NYTPhotoViewer; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACH_O_TYPE = staticlib; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - WRAPPER_EXTENSION = bundle; }; - name = Debug; + name = Release; }; FB45FFD90572718D82AB9092B750F0CA /* Release */ = { isa = XCBuildConfiguration; @@ -1617,6 +1597,30 @@ }; name = Release; }; + FBA19C1D5000A04B1B3861ACC3058CDC /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 064E1C219125C6C9038C857CA3BD6583 /* NYTPhotoViewer.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + PRODUCT_NAME = NYTPhotoViewer; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + FE3CA459FCBC18158EEC066F48E344D6 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 064E1C219125C6C9038C857CA3BD6583 /* NYTPhotoViewer.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + PRODUCT_NAME = NYTPhotoViewer; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1647,11 +1651,11 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 6036E348A4C8A9BA7469EC8F37C46A35 /* Build configuration list for PBXNativeTarget "NYTPhotoViewer-NYTPhotoViewer" */ = { + 6F99B716F6784ADB4556CCEAA5AB70D0 /* Build configuration list for PBXNativeTarget "NYTPhotoViewer-NYTPhotoViewer" */ = { isa = XCConfigurationList; buildConfigurations = ( - E46F045EB51E8BCBE8E69EF26C4114AE /* Debug */, - 07C7D422FBBC73EBCFFA19BF6DBBC16E /* Release */, + FBA19C1D5000A04B1B3861ACC3058CDC /* Debug */, + FE3CA459FCBC18158EEC066F48E344D6 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1683,11 +1687,11 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - AD9E12A71BE759218DCC7B41CDEC9E5B /* Build configuration list for PBXNativeTarget "NYTPhotoViewer" */ = { + B0D4D8F6CF2CEDD35DA8E8FC4C015333 /* Build configuration list for PBXNativeTarget "NYTPhotoViewer" */ = { isa = XCConfigurationList; buildConfigurations = ( - 04B1C0307FAB8C7B952A76826F86192E /* Debug */, - 0FEB87075DCF9D6DC9C8D748F7CEE790 /* Release */, + CF34DA6D14B42D7490C1758CBBA5355E /* Debug */, + 5DAE9E1F9AE6FCC978975B2ECE991D13 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/NYTPhotoViewer.xcscheme b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/NYTPhotoViewer.xcscheme index f7673e42..8984f21c 100644 --- a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/NYTPhotoViewer.xcscheme +++ b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/NYTPhotoViewer.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Example/Pods/Target Support Files/Pods-NYTPhotoViewer-Swift/Pods-NYTPhotoViewer-Swift-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-NYTPhotoViewer-Swift/Pods-NYTPhotoViewer-Swift-acknowledgements.markdown index bebdb55c..b41e9dfe 100644 --- a/Example/Pods/Target Support Files/Pods-NYTPhotoViewer-Swift/Pods-NYTPhotoViewer-Swift-acknowledgements.markdown +++ b/Example/Pods/Target Support Files/Pods-NYTPhotoViewer-Swift/Pods-NYTPhotoViewer-Swift-acknowledgements.markdown @@ -5,7 +5,7 @@ This application makes use of the following third party libraries: The MIT License (MIT) -Copyright (c) 2014 Flipboard +Copyright (c) 2014-2015 Flipboard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25,6 +25,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ## NYTPhotoViewer Copyright (c) 2015 The New York Times Company diff --git a/Example/Pods/Target Support Files/Pods-NYTPhotoViewer-Swift/Pods-NYTPhotoViewer-Swift-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-NYTPhotoViewer-Swift/Pods-NYTPhotoViewer-Swift-acknowledgements.plist index c4754d16..41303ec9 100644 --- a/Example/Pods/Target Support Files/Pods-NYTPhotoViewer-Swift/Pods-NYTPhotoViewer-Swift-acknowledgements.plist +++ b/Example/Pods/Target Support Files/Pods-NYTPhotoViewer-Swift/Pods-NYTPhotoViewer-Swift-acknowledgements.plist @@ -16,7 +16,7 @@ FooterText The MIT License (MIT) -Copyright (c) 2014 Flipboard +Copyright (c) 2014-2015 Flipboard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -34,7 +34,8 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +SOFTWARE. + Title FLAnimatedImage Type diff --git a/Example/Pods/Target Support Files/Pods-NYTPhotoViewer-SwiftTests/Pods-NYTPhotoViewer-SwiftTests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-NYTPhotoViewer-SwiftTests/Pods-NYTPhotoViewer-SwiftTests-acknowledgements.markdown index ec2b3b6b..ba0c2e41 100644 --- a/Example/Pods/Target Support Files/Pods-NYTPhotoViewer-SwiftTests/Pods-NYTPhotoViewer-SwiftTests-acknowledgements.markdown +++ b/Example/Pods/Target Support Files/Pods-NYTPhotoViewer-SwiftTests/Pods-NYTPhotoViewer-SwiftTests-acknowledgements.markdown @@ -5,7 +5,7 @@ This application makes use of the following third party libraries: The MIT License (MIT) -Copyright (c) 2014 Flipboard +Copyright (c) 2014-2015 Flipboard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25,6 +25,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ## NYTPhotoViewer Copyright (c) 2015 The New York Times Company diff --git a/Example/Pods/Target Support Files/Pods-NYTPhotoViewer-SwiftTests/Pods-NYTPhotoViewer-SwiftTests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-NYTPhotoViewer-SwiftTests/Pods-NYTPhotoViewer-SwiftTests-acknowledgements.plist index 86933e6d..48af7b00 100644 --- a/Example/Pods/Target Support Files/Pods-NYTPhotoViewer-SwiftTests/Pods-NYTPhotoViewer-SwiftTests-acknowledgements.plist +++ b/Example/Pods/Target Support Files/Pods-NYTPhotoViewer-SwiftTests/Pods-NYTPhotoViewer-SwiftTests-acknowledgements.plist @@ -16,7 +16,7 @@ FooterText The MIT License (MIT) -Copyright (c) 2014 Flipboard +Copyright (c) 2014-2015 Flipboard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -34,7 +34,8 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +SOFTWARE. + Title FLAnimatedImage Type diff --git a/Example/Pods/Target Support Files/Pods-NYTPhotoViewer/Pods-NYTPhotoViewer-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-NYTPhotoViewer/Pods-NYTPhotoViewer-acknowledgements.markdown index bebdb55c..b41e9dfe 100644 --- a/Example/Pods/Target Support Files/Pods-NYTPhotoViewer/Pods-NYTPhotoViewer-acknowledgements.markdown +++ b/Example/Pods/Target Support Files/Pods-NYTPhotoViewer/Pods-NYTPhotoViewer-acknowledgements.markdown @@ -5,7 +5,7 @@ This application makes use of the following third party libraries: The MIT License (MIT) -Copyright (c) 2014 Flipboard +Copyright (c) 2014-2015 Flipboard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25,6 +25,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ## NYTPhotoViewer Copyright (c) 2015 The New York Times Company diff --git a/Example/Pods/Target Support Files/Pods-NYTPhotoViewer/Pods-NYTPhotoViewer-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-NYTPhotoViewer/Pods-NYTPhotoViewer-acknowledgements.plist index c4754d16..41303ec9 100644 --- a/Example/Pods/Target Support Files/Pods-NYTPhotoViewer/Pods-NYTPhotoViewer-acknowledgements.plist +++ b/Example/Pods/Target Support Files/Pods-NYTPhotoViewer/Pods-NYTPhotoViewer-acknowledgements.plist @@ -16,7 +16,7 @@ FooterText The MIT License (MIT) -Copyright (c) 2014 Flipboard +Copyright (c) 2014-2015 Flipboard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -34,7 +34,8 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +SOFTWARE. + Title FLAnimatedImage Type diff --git a/Example/Pods/Target Support Files/Pods-Tests/Pods-Tests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-Tests/Pods-Tests-acknowledgements.markdown index ec2b3b6b..ba0c2e41 100644 --- a/Example/Pods/Target Support Files/Pods-Tests/Pods-Tests-acknowledgements.markdown +++ b/Example/Pods/Target Support Files/Pods-Tests/Pods-Tests-acknowledgements.markdown @@ -5,7 +5,7 @@ This application makes use of the following third party libraries: The MIT License (MIT) -Copyright (c) 2014 Flipboard +Copyright (c) 2014-2015 Flipboard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25,6 +25,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ## NYTPhotoViewer Copyright (c) 2015 The New York Times Company diff --git a/Example/Pods/Target Support Files/Pods-Tests/Pods-Tests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-Tests/Pods-Tests-acknowledgements.plist index 86933e6d..48af7b00 100644 --- a/Example/Pods/Target Support Files/Pods-Tests/Pods-Tests-acknowledgements.plist +++ b/Example/Pods/Target Support Files/Pods-Tests/Pods-Tests-acknowledgements.plist @@ -16,7 +16,7 @@ FooterText The MIT License (MIT) -Copyright (c) 2014 Flipboard +Copyright (c) 2014-2015 Flipboard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -34,7 +34,8 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +SOFTWARE. + Title FLAnimatedImage Type diff --git a/Pod/Classes/ios/NYTPhotoCaptionView.h b/Pod/Classes/ios/NYTPhotoCaptionView.h index 3e7d61ef..1b712ae5 100644 --- a/Pod/Classes/ios/NYTPhotoCaptionView.h +++ b/Pod/Classes/ios/NYTPhotoCaptionView.h @@ -7,18 +7,14 @@ // @import UIKit; +#import "NYTPhotoCaptionViewLayoutWidthHinting.h" NS_ASSUME_NONNULL_BEGIN -/** - * The left and right margin around the content. - */ -extern const CGFloat NYTPhotoCaptionViewHorizontalMargin; - /** * A view used to display the caption for a photo. */ -@interface NYTPhotoCaptionView : UIView +@interface NYTPhotoCaptionView : UIView /** * Designated initializer that takes all the caption attributed strings as arguments. diff --git a/Pod/Classes/ios/NYTPhotoCaptionView.m b/Pod/Classes/ios/NYTPhotoCaptionView.m index bc5cb603..7e545638 100644 --- a/Pod/Classes/ios/NYTPhotoCaptionView.m +++ b/Pod/Classes/ios/NYTPhotoCaptionView.m @@ -8,8 +8,8 @@ #import "NYTPhotoCaptionView.h" -const CGFloat NYTPhotoCaptionViewHorizontalMargin = 16.0; -static const CGFloat NYTPhotoCaptionViewVerticalMargin = 12.0; +static const CGFloat NYTPhotoCaptionViewHorizontalMargin = 8.0; +static const CGFloat NYTPhotoCaptionViewVerticalMargin = 7.0; @interface NYTPhotoCaptionView () @@ -19,13 +19,15 @@ - (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER; @property (nonatomic, readonly) NSAttributedString *attributedSummary; @property (nonatomic, readonly) NSAttributedString *attributedCredit; -@property (nonatomic) UILabel *textLabel; +@property (nonatomic) UITextView *textView; @property (nonatomic) CAGradientLayer *gradientLayer; @end @implementation NYTPhotoCaptionView +@synthesize preferredMaxLayoutWidth = _preferredMaxLayoutWidth; + #pragma mark - UIView - (instancetype)initWithFrame:(CGRect)frame { @@ -42,10 +44,42 @@ - (instancetype)initWithCoder:(NSCoder *)aDecoder { return self; } ++ (BOOL)requiresConstraintBasedLayout { + return YES; +} + +- (void)didMoveToSuperview { + [super didMoveToSuperview]; + + NSLayoutConstraint *maxHeightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationLessThanOrEqual toItem:self.superview attribute:NSLayoutAttributeHeight multiplier:0.3f constant:0.0f]; + [self.superview addConstraint:maxHeightConstraint]; +} + - (void)layoutSubviews { [super layoutSubviews]; - - self.gradientLayer.frame = self.layer.bounds; + + // On iOS 8.x, when this view is height-constrained, neither `self.bounds` nor `self.layer.bounds` reflects the new layout height immediately after `[super layoutSubviews]`. Both of those properties appear correct in the next runloop. + // This problem doesn't affect iOS 9 and there may be a better solution; PRs welcome. + dispatch_async(dispatch_get_main_queue(), ^{ + self.gradientLayer.frame = self.layer.bounds; + }); +} + +- (CGSize)intrinsicContentSize { + CGSize contentSize = [self.textView sizeThatFits:CGSizeMake(self.preferredMaxLayoutWidth, CGFLOAT_MAX)]; + CGFloat width = (CGFloat)self.preferredMaxLayoutWidth; + CGFloat height = (CGFloat)ceil(contentSize.height); + + return CGSizeMake(width, height); +} + +- (void)setPreferredMaxLayoutWidth:(CGFloat)preferredMaxLayoutWidth { + preferredMaxLayoutWidth = (CGFloat)ceil(preferredMaxLayoutWidth); + + if (ABS(_preferredMaxLayoutWidth - preferredMaxLayoutWidth) > 0.1) { + _preferredMaxLayoutWidth = preferredMaxLayoutWidth; + [self invalidateIntrinsicContentSize]; + } } #pragma mark - NYTPhotoCaptionView @@ -67,21 +101,25 @@ - (instancetype)initWithAttributedTitle:(NSAttributedString *)attributedTitle at - (void)commonInit { self.translatesAutoresizingMaskIntoConstraints = NO; - [self setupTextLabel]; - [self updateTextLabelAttributedText]; + [self setupTextView]; + [self updateTextViewAttributedText]; [self setupGradient]; } -- (void)setupTextLabel { - self.textLabel = [[UILabel alloc] init]; - self.textLabel.numberOfLines = 0; - self.textLabel.translatesAutoresizingMaskIntoConstraints = NO; - [self addSubview:self.textLabel]; +- (void)setupTextView { + self.textView = [[UITextView alloc] initWithFrame:CGRectZero textContainer:nil]; + self.textView.translatesAutoresizingMaskIntoConstraints = NO; + self.textView.editable = NO; + self.textView.dataDetectorTypes = UIDataDetectorTypeNone; + self.textView.backgroundColor = [UIColor clearColor]; + self.textView.textContainerInset = UIEdgeInsetsMake(NYTPhotoCaptionViewVerticalMargin, NYTPhotoCaptionViewHorizontalMargin, NYTPhotoCaptionViewVerticalMargin, NYTPhotoCaptionViewHorizontalMargin); + + [self addSubview:self.textView]; - NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.textLabel attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:NYTPhotoCaptionViewVerticalMargin]; - NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:self.textLabel attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-NYTPhotoCaptionViewVerticalMargin]; - NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self.textLabel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1.0 constant:-NYTPhotoCaptionViewHorizontalMargin * 2.0]; - NSLayoutConstraint *horizontalPositionConstraint = [NSLayoutConstraint constraintWithItem:self.textLabel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]; + NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.textView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]; + NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:self.textView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0]; + NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self.textView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]; + NSLayoutConstraint *horizontalPositionConstraint = [NSLayoutConstraint constraintWithItem:self.textView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]; [self addConstraints:@[topConstraint, bottomConstraint, widthConstraint, horizontalPositionConstraint]]; } @@ -93,7 +131,7 @@ - (void)setupGradient { [self.layer insertSublayer:self.gradientLayer atIndex:0]; } -- (void)updateTextLabelAttributedText { +- (void)updateTextViewAttributedText { NSMutableAttributedString *attributedLabelText = [[NSMutableAttributedString alloc] init]; if (self.attributedTitle) { @@ -116,7 +154,7 @@ - (void)updateTextLabelAttributedText { [attributedLabelText appendAttributedString:self.attributedCredit]; } - self.textLabel.attributedText = attributedLabelText; + self.textView.attributedText = attributedLabelText; } @end diff --git a/Pod/Classes/ios/NYTPhotosOverlayView.m b/Pod/Classes/ios/NYTPhotosOverlayView.m index b58542ce..fc001066 100644 --- a/Pod/Classes/ios/NYTPhotosOverlayView.m +++ b/Pod/Classes/ios/NYTPhotosOverlayView.m @@ -7,6 +7,7 @@ // #import "NYTPhotosOverlayView.h" +#import "NYTPhotoCaptionViewLayoutWidthHinting.h" @interface NYTPhotosOverlayView () @@ -49,6 +50,10 @@ - (void)layoutSubviews { }]; [super layoutSubviews]; + + if ([self.captionView conformsToProtocol:@protocol(NYTPhotoCaptionViewLayoutWidthHinting)]) { + [(id) self.captionView setPreferredMaxLayoutWidth:self.bounds.size.width]; + } } #pragma mark - NYTPhotosOverlayView diff --git a/Pod/Classes/ios/NYTPhotosViewController.h b/Pod/Classes/ios/NYTPhotosViewController.h index 01e9fcaf..10c29679 100644 --- a/Pod/Classes/ios/NYTPhotosViewController.h +++ b/Pod/Classes/ios/NYTPhotosViewController.h @@ -1,6 +1,6 @@ // // NYTPhotosViewController.h -// NYTNewsReader +// NYTPhotoViewer // // Created by Brian Capps on 2/10/15. // Copyright (c) 2015 NYTimes. All rights reserved. diff --git a/Pod/Classes/ios/NYTPhotosViewController.m b/Pod/Classes/ios/NYTPhotosViewController.m index 58da0c04..622ecb4c 100644 --- a/Pod/Classes/ios/NYTPhotosViewController.m +++ b/Pod/Classes/ios/NYTPhotosViewController.m @@ -1,6 +1,6 @@ // // NYTPhotosViewController.m -// NYTNewsReader +// NYTPhotoViewer // // Created by Brian Capps on 2/10/15. // Copyright (c) 2015 NYTimes. All rights reserved. @@ -27,7 +27,7 @@ static const CGFloat NYTPhotosViewControllerOverlayAnimationDuration = 0.2; static const CGFloat NYTPhotosViewControllerInterPhotoSpacing = 16.0; -static const UIEdgeInsets NYTPhotosViewControllerCloseButtinImageInsets = {3, 0, -3, 0}; +static const UIEdgeInsets NYTPhotosViewControllerCloseButtonImageInsets = {3, 0, -3, 0}; @interface NYTPhotosViewController () @@ -175,10 +175,9 @@ - (void)commonInitWithPhotos:(NSArray *)photos initialPhoto:(id )initi self.transitioningDelegate = _transitionController; self.modalPresentationCapturesStatusBarAppearance = YES; - // iOS 7 has an issue with constraints that could evaluate to be negative, so we set the width to the margins' size. - _overlayView = [[NYTPhotosOverlayView alloc] initWithFrame:CGRectMake(0, 0, NYTPhotoCaptionViewHorizontalMargin * 2.0, 0)]; + _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 = NYTPhotosViewControllerCloseButtinImageInsets; + _overlayView.leftBarButtonItem.imageInsets = NYTPhotosViewControllerCloseButtonImageInsets; _overlayView.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(actionButtonTapped:)]; _notificationCenter = [[NSNotificationCenter alloc] init]; diff --git a/Pod/Classes/ios/Protocols/NYTPhoto.h b/Pod/Classes/ios/Protocols/NYTPhoto.h index b25e099c..13a58487 100644 --- a/Pod/Classes/ios/Protocols/NYTPhoto.h +++ b/Pod/Classes/ios/Protocols/NYTPhoto.h @@ -1,6 +1,6 @@ // // NYTPhoto.h -// NYTNewsReader +// NYTPhotoViewer // // Created by Brian Capps on 2/10/15. // Copyright (c) 2015 NYTimes. All rights reserved. diff --git a/Pod/Classes/ios/Protocols/NYTPhotoCaptionViewLayoutWidthHinting.h b/Pod/Classes/ios/Protocols/NYTPhotoCaptionViewLayoutWidthHinting.h new file mode 100644 index 00000000..73739ca8 --- /dev/null +++ b/Pod/Classes/ios/Protocols/NYTPhotoCaptionViewLayoutWidthHinting.h @@ -0,0 +1,29 @@ +// +// NYTPhotoCaptionViewLayoutWidthHinting.h +// NYTPhotoViewer +// +// Created by Chris Dzombak on 10/30/15. +// +// + +@import Foundation; +@import UIKit; + +/** + * Allows a view to opt-in to receiving a hint of its layout width. This aids in calculating an appropriate intrinsic content size. + */ +@protocol NYTPhotoCaptionViewLayoutWidthHinting + +/** + * The preferred maximum width, in points, of this caption view. + * + * This property works exactly as it does on `UILabel`. + * + * This property affects the size of the view when layout constraints are applied to it. During layout, if the text extends beyond the width specified by this property, the additional text is flowed to one or more new lines, thereby increasing the height of the view. + */ +@property (nonatomic) CGFloat preferredMaxLayoutWidth; + +@end + +@interface UILabel (NYTPhotoCaptionViewLayoutWidthHinting) +@end diff --git a/Pod/Classes/ios/Protocols/NYTPhotosViewControllerDataSource.h b/Pod/Classes/ios/Protocols/NYTPhotosViewControllerDataSource.h index 51c868a8..cf8a007b 100644 --- a/Pod/Classes/ios/Protocols/NYTPhotosViewControllerDataSource.h +++ b/Pod/Classes/ios/Protocols/NYTPhotosViewControllerDataSource.h @@ -1,6 +1,6 @@ // // NYTPhotosViewControllerDataSource.h -// NYTNewsReader +// NYTPhotoViewer // // Created by Brian Capps on 2/10/15. // Copyright (c) 2015 NYTimes. All rights reserved.