Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions Optik/Classes/AlbumViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -80,21 +80,23 @@ internal final class AlbumViewController: UIViewController {
private var cachedRemoteImages: [URL: UIImage] = [:]
private var viewDidAppear: Bool = false

private var transitionController: TransitionController = TransitionController()
private var transitionController: TransitionController

// MARK: - Init/Deinit

init(imageData: ImageData,
initialImageDisplayIndex: Int,
activityIndicatorColor: UIColor?,
dismissButtonImage: UIImage?,
dismissButtonPosition: DismissButtonPosition) {
dismissButtonPosition: DismissButtonPosition,
transitionShadow: Bool) {

self.imageData = imageData
self.initialImageDisplayIndex = initialImageDisplayIndex
self.activityIndicatorColor = activityIndicatorColor
self.dismissButtonImage = dismissButtonImage
self.dismissButtonPosition = dismissButtonPosition
self.transitionController = TransitionController(transitionShadow: transitionShadow)

pageViewController = UIPageViewController(transitionStyle: .scroll,
navigationOrientation: .horizontal,
Expand Down
28 changes: 20 additions & 8 deletions Optik/Classes/Optik.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,22 @@ import UIKit
- parameter delegate: Image viewer delegate.
- parameter dismissButtonImage: Image for the dismiss button.
- parameter dismissButtonPosition: Dismiss button position.
- parameter transitionShadow Whether to display a shadow to the image or not during transitions.

- returns: The created view controller.
*/
public func imageViewer(withImages images: [UIImage],
initialImageDisplayIndex: Int = 0,
delegate: ImageViewerDelegate? = nil,
dismissButtonImage: UIImage? = nil,
dismissButtonPosition: DismissButtonPosition = .topLeading) -> UIViewController {
dismissButtonPosition: DismissButtonPosition = .topLeading,
transitionShadow: Bool = true) -> UIViewController {
let albumViewController = imageViewer(withData: .local(images: images),
initialImageDisplayIndex: initialImageDisplayIndex,
delegate: delegate,
dismissButtonImage: dismissButtonImage,
dismissButtonPosition: dismissButtonPosition)
albumViewController.modalPresentationStyle = .custom
albumViewController.imageViewerDelegate = delegate
dismissButtonPosition: dismissButtonPosition,
transitionShadow: transitionShadow)

return albumViewController
}
Expand All @@ -45,38 +47,48 @@ public func imageViewer(withImages images: [UIImage],
- parameter activityIndicatorColor: Tint color of the activity indicator that is displayed while images are being downloaded.
- parameter dismissButtonImage: Image for the dismiss button.
- parameter dismissButtonPosition: Dismiss button position.
- parameter transitionShadow Whether to display a shadow to the image or not during transitions.

- returns: The created view controller.
*/
public func imageViewer(withURLs urls: [URL],
initialImageDisplayIndex: Int = 0,
delegate: ImageViewerDelegate? = nil,
imageDownloader: ImageDownloader,
activityIndicatorColor: UIColor = .white,
dismissButtonImage: UIImage? = nil,
dismissButtonPosition: DismissButtonPosition = .topLeading) -> UIViewController {
dismissButtonPosition: DismissButtonPosition = .topLeading,
transitionShadow: Bool = true) -> UIViewController {
return imageViewer(withData: .remote(urls: urls, imageDownloader: imageDownloader),
initialImageDisplayIndex: initialImageDisplayIndex,
delegate: delegate,
activityIndicatorColor: activityIndicatorColor,
dismissButtonImage: dismissButtonImage,
dismissButtonPosition: dismissButtonPosition)
dismissButtonPosition: dismissButtonPosition,
transitionShadow: transitionShadow)
}

// MARK: - Private functions

private func imageViewer(withData imageData: ImageData,
initialImageDisplayIndex: Int,
delegate: ImageViewerDelegate? = nil,
activityIndicatorColor: UIColor? = nil,
dismissButtonImage: UIImage?,
dismissButtonPosition: DismissButtonPosition) -> AlbumViewController {
dismissButtonPosition: DismissButtonPosition,
transitionShadow: Bool) -> AlbumViewController {
let bundle = Bundle(for: AlbumViewController.self)
let defaultDismissButtonImage = UIImage(named: "DismissIcon", in: bundle, compatibleWith: nil)

let albumViewController = AlbumViewController(imageData: imageData,
initialImageDisplayIndex: initialImageDisplayIndex,
activityIndicatorColor: activityIndicatorColor,
dismissButtonImage: dismissButtonImage ?? defaultDismissButtonImage,
dismissButtonPosition: dismissButtonPosition)
dismissButtonPosition: dismissButtonPosition,
transitionShadow: transitionShadow)
albumViewController.modalPresentationCapturesStatusBarAppearance = true
albumViewController.modalPresentationStyle = .custom
albumViewController.imageViewerDelegate = delegate

return albumViewController
}
15 changes: 10 additions & 5 deletions Optik/Classes/TransitionAnimator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ internal final class TransitionAnimator: NSObject {
private weak var toImageView: UIImageView?
private weak var animationView: UIImageView?

private var transitionShadow: Bool

fileprivate weak var fromViewController: UIViewController?
fileprivate weak var toViewController: UIViewController?

Expand All @@ -45,10 +47,11 @@ internal final class TransitionAnimator: NSObject {

// MARK: - Init/deinit

init(transitionType: TransitionType, fromImageView: UIImageView, toImageView: UIImageView) {
init(transitionType: TransitionType, fromImageView: UIImageView, toImageView: UIImageView, transitionShadow: Bool) {
self.transitionType = transitionType
self.fromImageView = fromImageView
self.toImageView = toImageView
self.transitionShadow = transitionShadow

super.init()
}
Expand Down Expand Up @@ -202,10 +205,12 @@ internal final class TransitionAnimator: NSObject {
self.animationView = animationView

animationView.frame = fromSuperView.convert(fromImageView.frame, to: transitionContainerView)
animationView.layer.shadowColor = Constants.animationViewShadowColor
animationView.layer.shadowOffset = Constants.animationViewShadowOffset
animationView.layer.shadowRadius = Constants.animationViewShadowRadius
animationView.layer.shadowOpacity = Constants.animationViewShadowOpacity
if (transitionShadow) {
animationView.layer.shadowColor = Constants.animationViewShadowColor
animationView.layer.shadowOffset = Constants.animationViewShadowOffset
animationView.layer.shadowRadius = Constants.animationViewShadowRadius
animationView.layer.shadowOpacity = Constants.animationViewShadowOpacity
}

fromImageView.isHidden = true
toImageView.isHidden = true
Expand Down
16 changes: 14 additions & 2 deletions Optik/Classes/TransitionController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,16 @@ internal final class TransitionController: NSObject {
fileprivate var dismissTransitionAnimator: TransitionAnimator?
fileprivate var shouldDismissInteractively: Bool = false

fileprivate var transitionShadow: Bool

private var lastPanTranslation: CGPoint?

// MARK: - Initializers

init(transitionShadow: Bool) {
self.transitionShadow = transitionShadow
}

// MARK: - Instance functions

/**
Expand Down Expand Up @@ -119,7 +127,10 @@ extension TransitionController: UIViewControllerTransitioningDelegate {
return nil
}

return TransitionAnimator(transitionType: .present, fromImageView: fromImageView, toImageView: toImageView)
return TransitionAnimator(transitionType: .present,
fromImageView: fromImageView,
toImageView: toImageView,
transitionShadow: transitionShadow)
}

func animationController(forDismissed dismissed: UIViewController)
Expand All @@ -132,7 +143,8 @@ extension TransitionController: UIViewControllerTransitioningDelegate {

dismissTransitionAnimator = TransitionAnimator(transitionType: .dismiss,
fromImageView: fromImageView,
toImageView: toImageView)
toImageView: toImageView,
transitionShadow: transitionShadow)
return dismissTransitionAnimator
}

Expand Down