-
Notifications
You must be signed in to change notification settings - Fork 25
/
ImageZoomControllerSettings.swift
204 lines (158 loc) · 8.48 KB
/
ImageZoomControllerSettings.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
import Foundation
import InjectableLoggers
public struct ImageZoomControllerSettings {
public init() {}
/// When scale of imageView is below this threshold when initial pinch gesture ends, the overlay will be dismissed
public var zoomCancelingThreshold: ImageViewScale = 1.5
/// The miximum zoomsScale at which an image will be displayed
public var maximumZoomScale: ImageScale = 2
/// Causes the behavior of the ImageZoomController to (temporarily) be disabled when needed
public var isEnabled = true
/// Whether or not a background view needs to be displayed behind the zoomed imageViews
public var shouldDisplayBackground = false
/// The animators that will be used when Zoomy.Delegate doesn't provide an animator for needed events
public var defaultAnimators: CanProvideAnimatorForEvent = DefaultAnimators()
/// BackgroundView's color will animate to this value when content becomes smaller than the view it's displayed in
/// This will only have effect when shouldDisplayBackground is set to true
public var primaryBackgroundColor = UIColor.black.withAlphaComponent(0.6)
/// BackgroundView's color will animate to this value when content becomes bigger than or equal to any dimension of the view it's displayed in
/// This will only have effect when shouldDisplayBackground is set to true
public var secundaryBackgroundColor = UIColor.black
/// The scale at which the primary backgroundColor will be fully visible, alpha is lower before that
public var primaryBackgroundColorThreshold: ImageViewScale = 2
/// The translation at which the background will be fully transparant, alpha is higher before that
public var backgroundAlphaDismissalTranslationThreshold: CGFloat = 300
/// Whether or not warnings and errors should be logged to the console
public var shouldLogWarningsAndErrors = true
/// The amount of point that have to be panned while scrollView is bouncing in order to dismiss the overlay
/// Note: Settings this value alone doesn't have effect when dismissal by bounce is not enabled
public var neededTranslationToDismissOverlayOnScrollBounce: CGFloat = 80
/// The action that will be triggered when the imageView is tapped
public var actionOnTapImageView: Action & CanBeTriggeredByImageViewTap = Action.none
/// The action that will be triggerend when the imageView is double tapped
public var actionOnDoubleTapImageView: Action & CanBeTriggeredByImageViewDoubleTap = Action.none
/// The action that will be triggered when the overlay is tapped
public var actionOnTapOverlay: Action & CanBeTriggeredByOverlayTap = Action.none
/// The action that will be triggered when the overlay is double tapped
public var actionOnDoubleTapOverlay: Action & CanBeTriggeredByOverlayDoubleTap = Action.none
/// The action that will be triggered when the overlay is tapped
public var actionOnTapBackgroundView: Action & CanBeTriggeredByBackgroundViewTap = Action.none
/// The action that will be triggered when the backgroundView is double tapped
public var actionOnDoubleTapBackgroundView: Action & CanBeTriggeredByBackgroundDoubleTap = Action.none
/// The action that will be triggered when scrollView is bouncing while scrolling towards the top
public var actionOnScrollBounceTop: Action & CanBeTriggeredByScrollBounceTop = Action.none
/// The action that will be triggered when scrollView is bouncing while scrolling towards the left
public var actionOnScrollBounceLeft: Action & CanBeTriggeredByScrollBounceLeft = Action.none
/// The action that will be triggered when scrollView is bouncing while scrolling towards the right
public var actionOnScrollBounceRight: Action & CanBeTriggeredByScrollBounceRight = Action.none
/// The action that will be triggered when scrollView is bouncing while scrolling towards the bottom
public var actionOnScrollBounceBottom: Action & CanBeTriggeredByScrollBounceBottom = Action.none
}
// MARK: Presets
public extension ImageZoomControllerSettings {
static var defaultSettings: Settings {
return Settings()
}
static var backgroundEnabledSettings: Settings {
return defaultSettings.with(shouldDisplayBackground: true)
}
static var noZoomCancellingSettings: Settings {
return defaultSettings.with(zoomCancelingThreshold: 1)
}
static var instaZoomSettings: Settings {
return backgroundEnabledSettings.with(zoomCancelingThreshold: .infinity).with(defaultAnimators: DefaultAnimators().with(dismissalAnimator: SpringAnimator(duration: 0.6, springDamping:1)))
}
}
//MARK: Alterations
public extension ImageZoomControllerSettings {
func with(zoomCancelingThreshold: ImageViewScale) -> Settings {
var settings = self
settings.zoomCancelingThreshold = zoomCancelingThreshold
return settings
}
func with(maximumZoomScale: ImageScale) -> Settings {
var settings = self
settings.maximumZoomScale = maximumZoomScale
return settings
}
func with(isEnabled: Bool) -> Settings {
var settings = self
settings.isEnabled = isEnabled
return settings
}
func with(shouldDisplayBackground: Bool) -> Settings {
var settings = self
settings.shouldDisplayBackground = shouldDisplayBackground
return settings
}
func with(primaryBackgroundColor: UIColor) -> Settings {
var settings = self
settings.primaryBackgroundColor = primaryBackgroundColor
return settings
}
func with(secundaryBackgroundColor: UIColor) -> Settings {
var settings = self
settings.secundaryBackgroundColor = secundaryBackgroundColor
return settings
}
func with(neededTranslationToDismissOverlayOnScrollBounce: CGFloat) -> Settings {
var settings = self
settings.neededTranslationToDismissOverlayOnScrollBounce = neededTranslationToDismissOverlayOnScrollBounce
return settings
}
func with(actionOnTapOverlay: Action & CanBeTriggeredByOverlayTap) -> Settings {
var settings = self
settings.actionOnTapOverlay = actionOnTapOverlay
return settings
}
func with(actionOnDoubleTapOverlay: Action & CanBeTriggeredByOverlayDoubleTap) -> Settings {
var settings = self
settings.actionOnDoubleTapOverlay = actionOnDoubleTapOverlay
return settings
}
func with(actionOnTapBackgroundView: Action & CanBeTriggeredByBackgroundViewTap) -> Settings {
var settings = self
settings.actionOnTapBackgroundView = actionOnTapBackgroundView
return settings
}
func with(actionOnDoubleTapBackgroundView: Action & CanBeTriggeredByBackgroundDoubleTap) -> Settings {
var settings = self
settings.actionOnDoubleTapBackgroundView = actionOnDoubleTapBackgroundView
return settings
}
func with(actionOnScrollBounceTop: Action & CanBeTriggeredByScrollBounceTop) -> Settings {
var settings = self
settings.actionOnScrollBounceTop = actionOnScrollBounceTop
return settings
}
func with(actionOnScrollBounceLeft: Action & CanBeTriggeredByScrollBounceLeft) -> Settings {
var settings = self
settings.actionOnScrollBounceLeft = actionOnScrollBounceLeft
return settings
}
func with(actionOnScrollBounceRight: Action & CanBeTriggeredByScrollBounceRight) -> Settings {
var settings = self
settings.actionOnScrollBounceRight = actionOnScrollBounceRight
return settings
}
func with(actionOnScrollBounceBottom: Action & CanBeTriggeredByScrollBounceBottom) -> Settings {
var settings = self
settings.actionOnScrollBounceBottom = actionOnScrollBounceBottom
return settings
}
func with(actionOnTapImageView: Action & CanBeTriggeredByImageViewTap) -> Settings {
var settings = self
settings.actionOnTapImageView = actionOnTapImageView
return settings
}
func with(actionOnDoubleTapImageView: Action & CanBeTriggeredByImageViewDoubleTap) -> Settings {
var settings = self
settings.actionOnDoubleTapImageView = actionOnDoubleTapImageView
return settings
}
func with(defaultAnimators: CanProvideAnimatorForEvent) -> Settings {
var settings = self
settings.defaultAnimators = defaultAnimators
return settings
}
}