This repository was archived by the owner on Jun 17, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 312
/
Copy pathScaleTransformViewOptions+Layout.swift
141 lines (135 loc) · 5.25 KB
/
ScaleTransformViewOptions+Layout.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
//
// ScaleTransformViewOptions+Layout.swift
// CollectionViewPagingLayout
//
// Created by Amir on 28/03/2021.
// Copyright © 2021 Amir Khorsandi. All rights reserved.
//
import UIKit
import Foundation
public extension ScaleTransformViewOptions {
enum Layout: String, CaseIterable {
case invertedCylinder
case cylinder
case coverFlow
case rotary
case linear
case easeIn
case easeOut
case blur
}
static func layout(_ layout: Layout) -> Self {
switch layout {
case .blur:
return Self(
minScale: 0.6,
scaleRatio: 0.4,
translationRatio: CGPoint(x: 0.66, y: 0.2),
maxTranslationRatio: CGPoint(x: 2, y: 0),
blurEffectEnabled: true,
blurEffectRadiusRatio: 0.2
)
case .linear:
return Self(
minScale: 0.6,
scaleRatio: 0.4,
translationRatio: CGPoint(x: 0.66, y: 0.2),
maxTranslationRatio: CGPoint(x: 2, y: 0),
keepVerticalSpacingEqual: true,
keepHorizontalSpacingEqual: true,
scaleCurve: .linear,
translationCurve: .linear
)
case .easeIn:
return Self(
minScale: 0.6,
scaleRatio: 0.4,
translationRatio: CGPoint(x: 0.66, y: 0.2),
keepVerticalSpacingEqual: true,
keepHorizontalSpacingEqual: true,
scaleCurve: .easeIn,
translationCurve: .linear
)
case .easeOut:
return Self(
minScale: 0.6,
scaleRatio: 0.4,
translationRatio: CGPoint(x: 0.66, y: 0.2),
keepVerticalSpacingEqual: true,
keepHorizontalSpacingEqual: true,
scaleCurve: .linear,
translationCurve: .easeIn
)
case .rotary:
return Self(
minScale: 0,
scaleRatio: 0.4,
translationRatio: CGPoint(x: 0.1, y: 0.1),
minTranslationRatio: CGPoint(x: -1, y: 0),
maxTranslationRatio: CGPoint(x: 1, y: 1),
rotation3d: ScaleTransformViewOptions.Rotation3dOptions(angle: .pi / 15, minAngle: -.pi / 3, maxAngle: .pi / 3, x: 0, y: 0, z: 1, m34: -0.004),
translation3d: .init(translateRatios: (0.9, 0.1, 0),
minTranslateRatios: (-3, -0.8, -0.3),
maxTranslateRatios: (3, 0.8, -0.3))
)
case .cylinder:
return Self(
minScale: 0.55,
maxScale: 0.55,
scaleRatio: 0,
translationRatio: .zero,
minTranslationRatio: .zero,
maxTranslationRatio: .zero,
shadowEnabled: false,
rotation3d: .init(angle: .pi / 4, minAngle: -.pi, maxAngle: .pi, x: 0, y: 1, z: 0, m34: -0.000_4 - 0.8 * 0.000_2 ),
translation3d: .init(translateRatios: (0, 0, 0), minTranslateRatios: (0, 0, 1.25), maxTranslateRatios: (0, 0, 1.25))
)
case .invertedCylinder:
return Self(
minScale: 1.2,
maxScale: 1.2,
scaleRatio: 0,
translationRatio: .zero,
minTranslationRatio: .zero,
maxTranslationRatio: .zero,
shadowEnabled: false,
rotation3d: .init(angle: .pi / 3, minAngle: -.pi, maxAngle: .pi, x: 0, y: -1, z: 0, m34: -0.002),
translation3d: .init(translateRatios: (0.1, 0, 0),
minTranslateRatios: (-0.05, 0, 0.86),
maxTranslateRatios: (0.05, 0, -0.86))
)
case .coverFlow:
let defaultAngle: Double = .pi / 1.65
let minAngle: Double = -.pi / 3
let maxAngle: Double = .pi / 3
let rotation3d = Rotation3dOptions(
angle: defaultAngle,
minAngle: minAngle,
maxAngle: maxAngle,
x: 0,
y: -1,
z: 0,
m34: -0.000_5
)
let translateRatios: (CGFloat, CGFloat, CGFloat) = (0.1, 0, -0.7)
let minTranslateRatios: (CGFloat, CGFloat, CGFloat) = (-0.1, 0, -3)
let maxTranslateRatios: (CGFloat, CGFloat, CGFloat) = (0.1, 0, 0)
let translation3d = Translation3dOptions(
translateRatios: translateRatios,
minTranslateRatios: minTranslateRatios,
maxTranslateRatios: maxTranslateRatios
)
return Self(
minScale: 0.7,
maxScale: 0.7,
scaleRatio: 0,
translationRatio: .zero,
minTranslationRatio: .zero,
maxTranslationRatio: .zero,
shadowEnabled: true,
rotation3d: rotation3d,
translation3d: translation3d
)
}
}
}