FLEXImagePreviewViewController.m 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. //
  2. // FLEXImagePreviewViewController.m
  3. // Flipboard
  4. //
  5. // Created by Ryan Olson on 6/12/14.
  6. // Copyright (c) 2014 Flipboard. All rights reserved.
  7. //
  8. #import "FLEXImagePreviewViewController.h"
  9. #import "FLEXUtility.h"
  10. #import "FLEXColor.h"
  11. #import "FLEXResources.h"
  12. @interface FLEXImagePreviewViewController () <UIScrollViewDelegate>
  13. @property (nonatomic) UIImage *image;
  14. @property (nonatomic) UIScrollView *scrollView;
  15. @property (nonatomic) UIImageView *imageView;
  16. @end
  17. #pragma mark -
  18. @implementation FLEXImagePreviewViewController
  19. #pragma mark Initialization
  20. + (instancetype)previewForView:(UIView *)view {
  21. return [self forImage:[FLEXUtility previewImageForView:view]];
  22. }
  23. + (instancetype)previewForLayer:(CALayer *)layer {
  24. return [self forImage:[FLEXUtility previewImageForLayer:layer]];
  25. }
  26. + (instancetype)forImage:(UIImage *)image {
  27. if (!image) {
  28. return nil;
  29. }
  30. return [[self alloc] initWithImage:image];
  31. }
  32. - (id)initWithImage:(UIImage *)image {
  33. self = [super init];
  34. if (self) {
  35. self.title = @"Preview";
  36. self.image = image;
  37. }
  38. return self;
  39. }
  40. #pragma mark Lifecycle
  41. - (void)viewDidLoad {
  42. [super viewDidLoad];
  43. self.view.backgroundColor = [UIColor colorWithPatternImage:FLEXResources.checkerPattern];
  44. self.imageView = [[UIImageView alloc] initWithImage:self.image];
  45. self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
  46. self.scrollView.delegate = self;
  47. self.scrollView.backgroundColor = self.view.backgroundColor;
  48. self.scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
  49. [self.scrollView addSubview:self.imageView];
  50. self.scrollView.contentSize = self.imageView.frame.size;
  51. self.scrollView.minimumZoomScale = 1.0;
  52. self.scrollView.maximumZoomScale = 2.0;
  53. [self.view addSubview:self.scrollView];
  54. self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(actionButtonPressed:)];
  55. }
  56. - (void)viewDidLayoutSubviews {
  57. [self centerContentInScrollViewIfNeeded];
  58. }
  59. #pragma mark UIScrollViewDelegate
  60. - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
  61. return self.imageView;
  62. }
  63. - (void)scrollViewDidZoom:(UIScrollView *)scrollView {
  64. [self centerContentInScrollViewIfNeeded];
  65. }
  66. #pragma mark Private
  67. - (void)centerContentInScrollViewIfNeeded {
  68. CGFloat horizontalInset = 0.0;
  69. CGFloat verticalInset = 0.0;
  70. if (self.scrollView.contentSize.width < self.scrollView.bounds.size.width) {
  71. horizontalInset = (self.scrollView.bounds.size.width - self.scrollView.contentSize.width) / 2.0;
  72. }
  73. if (self.scrollView.contentSize.height < self.scrollView.bounds.size.height) {
  74. verticalInset = (self.scrollView.bounds.size.height - self.scrollView.contentSize.height) / 2.0;
  75. }
  76. self.scrollView.contentInset = UIEdgeInsetsMake(verticalInset, horizontalInset, verticalInset, horizontalInset);
  77. }
  78. - (void)actionButtonPressed:(id)sender {
  79. static BOOL canSaveToCameraRoll = NO, didShowWarning = NO;
  80. static dispatch_once_t onceToken;
  81. dispatch_once(&onceToken, ^{
  82. if ([UIDevice currentDevice].systemVersion.floatValue < 10) {
  83. canSaveToCameraRoll = YES;
  84. return;
  85. }
  86. NSBundle *mainBundle = NSBundle.mainBundle;
  87. if ([mainBundle.infoDictionary.allKeys containsObject:@"NSPhotoLibraryUsageDescription"]) {
  88. canSaveToCameraRoll = YES;
  89. }
  90. });
  91. UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[self.image] applicationActivities:@[]];
  92. if (!canSaveToCameraRoll && !didShowWarning) {
  93. didShowWarning = YES;
  94. NSString *msg = @"Add 'NSPhotoLibraryUsageDescription' to this app's Info.plist to save images.";
  95. [FLEXAlert makeAlert:^(FLEXAlert *make) {
  96. make.title(@"Reminder").message(msg);
  97. make.button(@"OK").handler(^(NSArray<NSString *> *strings) {
  98. [self presentViewController:activityVC animated:YES completion:nil];
  99. });
  100. } showFrom:self];
  101. } else {
  102. [self presentViewController:activityVC animated:YES completion:nil];
  103. }
  104. }
  105. @end