diff --git a/Example/ViewController.swift b/Example/ViewController.swift index ccdc911..429c100 100644 --- a/Example/ViewController.swift +++ b/Example/ViewController.swift @@ -89,6 +89,8 @@ private extension UIView.ContentMode { return "bottomLeft" case .bottomRight: return "bottomRight" + @unknown default: + return "" } } } diff --git a/ImageViewer/AnimatableImageView.swift b/ImageViewer/AnimatableImageView.swift index 26901ca..3808c1d 100644 --- a/ImageViewer/AnimatableImageView.swift +++ b/ImageViewer/AnimatableImageView.swift @@ -74,6 +74,8 @@ private extension AnimatableImageView { case .bottomRight: imageView.bounds = Utilities.rect(forSize: image.size) imageView.center = Utilities.bottomRight(forSize: image.size, insideSize: bounds.size) + @unknown default: + return } } } diff --git a/ImageViewer/ImageViewerConfiguration.swift b/ImageViewer/ImageViewerConfiguration.swift index 0084f02..60a0164 100644 --- a/ImageViewer/ImageViewerConfiguration.swift +++ b/ImageViewer/ImageViewerConfiguration.swift @@ -3,11 +3,13 @@ import UIKit public typealias ImageCompletion = (UIImage?) -> Void public typealias ImageBlock = (@escaping ImageCompletion) -> Void +public typealias ScrollViewBlock = (UIScrollView) -> Void public final class ImageViewerConfiguration { public var image: UIImage? public var imageView: UIImageView? public var imageBlock: ImageBlock? + public var setupScrollViewBlock: ScrollViewBlock? public typealias ConfigurationClosure = (ImageViewerConfiguration) -> () diff --git a/ImageViewer/ImageViewerController.swift b/ImageViewer/ImageViewerController.swift index 9634125..498e642 100644 --- a/ImageViewer/ImageViewerController.swift +++ b/ImageViewer/ImageViewerController.swift @@ -2,10 +2,11 @@ import UIKit import AVFoundation public final class ImageViewerController: UIViewController { - @IBOutlet fileprivate var scrollView: UIScrollView! - @IBOutlet fileprivate var imageView: UIImageView! - @IBOutlet fileprivate var activityIndicator: UIActivityIndicatorView! - + @IBOutlet fileprivate weak var scrollView: UIScrollView! + @IBOutlet fileprivate weak var imageView: UIImageView! + @IBOutlet fileprivate weak var activityIndicator: UIActivityIndicatorView! + @IBOutlet fileprivate weak var shareButton: UIButton! + fileprivate var transitionHandler: ImageViewerTransitioningHandler? fileprivate let configuration: ImageViewerConfiguration? @@ -28,7 +29,7 @@ public final class ImageViewerController: UIViewController { override public func viewDidLoad() { super.viewDidLoad() - imageView.image = configuration?.imageView?.image ?? configuration?.image + imageView.image = configuration?.image ?? configuration?.imageView?.image setupScrollView() setupGestureRecognizers() @@ -62,6 +63,8 @@ private extension ImageViewerController { scrollView.decelerationRate = UIScrollView.DecelerationRate.fast scrollView.alwaysBounceVertical = true scrollView.alwaysBounceHorizontal = true + + configuration?.setupScrollViewBlock?(scrollView) } func setupGestureRecognizers() { @@ -97,6 +100,14 @@ private extension ImageViewerController { @IBAction func closeButtonPressed() { dismiss(animated: true) } + + @IBAction func share() { + guard let image = imageView.image else { return } + let items = [image] + let ac = UIActivityViewController(activityItems: items, applicationActivities: nil) + ac.popoverPresentationController?.sourceView = shareButton + present(ac, animated: true) + } @objc func imageViewDoubleTapped(recognizer: UITapGestureRecognizer) { func zoomRectForScale(scale: CGFloat, center: CGPoint) -> CGRect { diff --git a/ImageViewer/Resources/ImageViewer-Assets.xcassets/Share.imageset/Contents.json b/ImageViewer/Resources/ImageViewer-Assets.xcassets/Share.imageset/Contents.json new file mode 100644 index 0000000..7d75f1c --- /dev/null +++ b/ImageViewer/Resources/ImageViewer-Assets.xcassets/Share.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Share.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Share@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Share@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ImageViewer/Resources/ImageViewer-Assets.xcassets/Share.imageset/Share.png b/ImageViewer/Resources/ImageViewer-Assets.xcassets/Share.imageset/Share.png new file mode 100644 index 0000000..f847990 Binary files /dev/null and b/ImageViewer/Resources/ImageViewer-Assets.xcassets/Share.imageset/Share.png differ diff --git a/ImageViewer/Resources/ImageViewer-Assets.xcassets/Share.imageset/Share@2x.png b/ImageViewer/Resources/ImageViewer-Assets.xcassets/Share.imageset/Share@2x.png new file mode 100644 index 0000000..8d21824 Binary files /dev/null and b/ImageViewer/Resources/ImageViewer-Assets.xcassets/Share.imageset/Share@2x.png differ diff --git a/ImageViewer/Resources/ImageViewer-Assets.xcassets/Share.imageset/Share@3x.png b/ImageViewer/Resources/ImageViewer-Assets.xcassets/Share.imageset/Share@3x.png new file mode 100644 index 0000000..031ce96 Binary files /dev/null and b/ImageViewer/Resources/ImageViewer-Assets.xcassets/Share.imageset/Share@3x.png differ diff --git a/ImageViewer/Resources/ImageViewerController.xib b/ImageViewer/Resources/ImageViewerController.xib index 07595fc..914e3c5 100644 --- a/ImageViewer/Resources/ImageViewerController.xib +++ b/ImageViewer/Resources/ImageViewerController.xib @@ -1,12 +1,9 @@ - - - - + + - - + @@ -15,6 +12,7 @@ + @@ -45,7 +43,7 @@ + + + + diff --git a/ImageViewer/Transitions/ImageViewerDismissalTransition.swift b/ImageViewer/Transitions/ImageViewerDismissalTransition.swift index 545c72f..670b710 100644 --- a/ImageViewer/Transitions/ImageViewerDismissalTransition.swift +++ b/ImageViewer/Transitions/ImageViewerDismissalTransition.swift @@ -112,7 +112,9 @@ private extension ImageViewerDismissalTransition { case .end: self.animatableImageview.contentMode = self.toImageView.contentMode self.animatableImageview.transform = .identity - self.animatableImageview.frame = self.toImageView.superview!.convert(self.toImageView.frame, to: nil) + if let superview = self.toImageView.superview { + self.animatableImageview.frame = superview.convert(self.toImageView.frame, to: nil) + } self.fadeView.alpha = 0.0 } } diff --git a/SimpleImageViewer.podspec b/SimpleImageViewer.podspec index 4e45dc6..423abfe 100644 --- a/SimpleImageViewer.podspec +++ b/SimpleImageViewer.podspec @@ -4,7 +4,7 @@ Pod::Spec.new do |s| s.name = "SimpleImageViewer" s.summary = "A snappy image viewer with zoom and interactive dismissal transition." s.requires_arc = true - s.version = "1.1.1" + s.version = "1.2.1" s.license = { :type => "MIT", :file => "LICENSE" } s.author = { "Lucas" => "lucas@afrogleap.com" } s.homepage = "https://github.com/aFrogleap/SimpleImageViewer" diff --git a/SimpleImageViewer.xcodeproj/project.pbxproj b/SimpleImageViewer.xcodeproj/project.pbxproj index a918b3c..37683bf 100644 --- a/SimpleImageViewer.xcodeproj/project.pbxproj +++ b/SimpleImageViewer.xcodeproj/project.pbxproj @@ -281,30 +281,31 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0900; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = aFrogleap; TargetAttributes = { A02EE5D31EF1897D000EAB41 = { CreatedOnToolsVersion = 8.3.2; - DevelopmentTeam = WQEYNHG5C2; + DevelopmentTeam = DZYTXHVP4K; ProvisioningStyle = Automatic; }; A07E76D21ECC94A400B77D46 = { CreatedOnToolsVersion = 8.3.2; - DevelopmentTeam = 44MAY72KU6; - LastSwiftMigration = 0900; - ProvisioningStyle = Manual; + DevelopmentTeam = DZYTXHVP4K; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; }; A0BF70A61EDC5B1400109F6E = { CreatedOnToolsVersion = 8.3.2; - LastSwiftMigration = 1000; - ProvisioningStyle = Manual; + DevelopmentTeam = DZYTXHVP4K; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; }; }; }; buildConfigurationList = A07E76CE1ECC94A400B77D46 /* Build configuration list for PBXProject "SimpleImageViewer" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -412,7 +413,7 @@ A02EE5DD1EF1897D000EAB41 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - DEVELOPMENT_TEAM = WQEYNHG5C2; + DEVELOPMENT_TEAM = DZYTXHVP4K; INFOPLIST_FILE = SimpleImageViewerTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.afrogleap.SimpleImageViewerTests; @@ -424,7 +425,7 @@ A02EE5DE1EF1897D000EAB41 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - DEVELOPMENT_TEAM = WQEYNHG5C2; + DEVELOPMENT_TEAM = DZYTXHVP4K; INFOPLIST_FILE = SimpleImageViewerTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.afrogleap.SimpleImageViewerTests; @@ -437,6 +438,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -447,6 +449,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -454,6 +457,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -494,6 +498,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -504,6 +509,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -511,6 +517,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -545,17 +552,19 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = 44MAY72KU6; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = DZYTXHVP4K; INFOPLIST_FILE = "$(SRCROOT)/ImageViewer/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.afrogleapbv.inhouse.swift.imageviewer; + PRODUCT_BUNDLE_IDENTIFIER = de.alexsteiner.imageviewer; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "d5b8f7cb-0120-427a-9ff1-14d28ee0046f"; - PROVISIONING_PROFILE_SPECIFIER = "aFrogleap Wildcard Development"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.2; + PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -564,15 +573,17 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = ""; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = DZYTXHVP4K; INFOPLIST_FILE = "$(SRCROOT)/ImageViewer/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.afrogleapbv.inhouse.swift.imageviewer; + PRODUCT_BUNDLE_IDENTIFIER = de.alexsteiner.imageviewer; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; }; name = Release; }; @@ -580,9 +591,10 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = DZYTXHVP4K; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -594,7 +606,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -604,9 +616,10 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = DZYTXHVP4K; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -618,7 +631,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; diff --git a/SimpleImageViewer.xcodeproj/xcshareddata/xcschemes/SimpleImageViewer.xcscheme b/SimpleImageViewer.xcodeproj/xcshareddata/xcschemes/SimpleImageViewer.xcscheme index bf75f27..b92f041 100644 --- a/SimpleImageViewer.xcodeproj/xcshareddata/xcschemes/SimpleImageViewer.xcscheme +++ b/SimpleImageViewer.xcodeproj/xcshareddata/xcschemes/SimpleImageViewer.xcscheme @@ -1,6 +1,6 @@