Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
1
1weather
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Dmitriy Stepanets
1weather
Commits
64c6f640
Commit
64c6f640
authored
Aug 14, 2021
by
Dmitry Stepanets
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added custom animation to page control
parent
41db5cfa
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
35 additions
and
42 deletions
+35
-42
1Weather/UI/View controllers/Onboarding/InitialOnboarding/OnboardingPageControl.swift
+29
-18
1Weather/UI/View controllers/Onboarding/InitialOnboarding/OnboardingPageController.swift
+6
-24
No files found.
1Weather/UI/View controllers/Onboarding/InitialOnboarding/OnboardingPageControl.swift
View file @
64c6f640
...
...
@@ -12,7 +12,6 @@ class OnboardingPageControl: UIView {
private
let
kSpacePerDot
:
CGFloat
=
10
private
let
kDotSize
:
CGSize
=
.
init
(
width
:
9
,
height
:
9
)
private
let
kIndicatorSize
:
CGSize
=
.
init
(
width
:
6
,
height
:
6
)
private
var
currentPageIndex
=
0
private
let
totalPagesCount
:
Int
private
let
indicator
=
UIView
()
private
var
dots
=
[
UIView
]()
...
...
@@ -20,46 +19,58 @@ class OnboardingPageControl: UIView {
init
(
totalPagesCount
:
Int
)
{
self
.
totalPagesCount
=
totalPagesCount
super
.
init
(
frame
:
.
zero
)
self
.
backgroundColor
=
.
lightGray
prepareView
()
prepareDots
()
prepareIndicator
()
snp
.
makeConstraints
{
make
in
make
.
height
.
equalTo
(
kDotSize
.
height
)
}
}
required
init
?(
coder
:
NSCoder
)
{
fatalError
(
"init(coder:) has not been implemented"
)
}
func
scroll
(
toPage
i
ndex
:
Int
,
screenTransitionProgress
:
CGFloat
)
{
func
scroll
(
toPage
nextPageIndex
:
Int
,
currentPageI
ndex
:
Int
,
screenTransitionProgress
:
CGFloat
)
{
guard
screenTransitionProgress
!=
0
else
{
return
}
var
scrollProgress
=
max
(
0
,
screenTransitionProgress
)
scrollProgress
=
min
(
screenTransitionProgress
,
1
)
print
(
"[Page] scroll to
\(
index
)
progress:
\(
scrollProgress
)
"
)
let
targetDot
=
dots
[
index
]
let
previousDot
=
dots
[
index
==
0
?
0
:
index
-
1
]
let
targetDot
=
dots
[
nextPageIndex
]
let
previousDot
=
dots
[
currentPageIndex
]
//Scale
// let scaleDelta = (kDotSize.width - kIndicatorSize.width) * scrollProgress
// previousDot.frame.size = .init(width: kIndicatorSize.width + scaleDelta, height: kIndicatorSize.height + scaleDelta)
// print("[Frame] prev dot frame: \(previousDot.frame)")
let
scaleDelta
=
(
kDotSize
.
width
-
kIndicatorSize
.
width
)
*
scrollProgress
targetDot
.
snp
.
updateConstraints
{
update
in
update
.
width
.
equalTo
(
kDotSize
.
width
-
scaleDelta
)
update
.
height
.
equalTo
(
kDotSize
.
height
-
scaleDelta
)
}
targetDot
.
layer
.
cornerRadius
=
(
kDotSize
.
height
-
scaleDelta
)
/
2
let
delta
=
targetDot
.
frame
.
origin
.
x
-
previousDot
.
frame
.
origin
.
x
previousDot
.
snp
.
updateConstraints
{
update
in
update
.
width
.
equalTo
(
kIndicatorSize
.
width
+
scaleDelta
)
update
.
height
.
equalTo
(
kIndicatorSize
.
height
+
scaleDelta
)
}
previousDot
.
layer
.
cornerRadius
=
(
kIndicatorSize
.
height
+
scaleDelta
)
/
2
//Offset
let
offsetDelta
=
targetDot
.
frame
.
origin
.
x
-
previousDot
.
frame
.
origin
.
x
indicator
.
snp
.
updateConstraints
{
update
in
update
.
left
.
equalToSuperview
()
.
inset
(
previousDot
.
frame
.
origin
.
x
+
d
elta
*
scrollProgress
)
update
.
left
.
equalToSuperview
()
.
inset
(
previousDot
.
frame
.
origin
.
x
+
offsetD
elta
*
scrollProgress
)
}
// indicator.frame.origin.x = previousDot.frame.origin.x + delta * scrollProgress
}
}
//MARK:- Prepare
private
extension
OnboardingPageControl
{
func
prepareView
()
{
snp
.
makeConstraints
{
make
in
make
.
height
.
equalTo
(
kDotSize
.
height
)
}
}
func
prepareDots
()
{
for
index
in
0
..<
totalPagesCount
{
let
dot
=
UIView
()
dot
.
backgroundColor
=
UIColor
.
blue
dot
.
backgroundColor
=
UIColor
(
hex
:
0xD0D0D0
)
dot
.
layer
.
cornerRadius
=
kDotSize
.
height
/
2
addSubview
(
dot
)
dots
.
append
(
dot
)
...
...
@@ -76,7 +87,7 @@ private extension OnboardingPageControl {
}
func
prepareIndicator
()
{
indicator
.
backgroundColor
=
UIColor
.
red
indicator
.
backgroundColor
=
ThemeManager
.
currentTheme
.
graphTintColor
indicator
.
layer
.
cornerRadius
=
kIndicatorSize
.
height
/
2
addSubview
(
indicator
)
...
...
1Weather/UI/View controllers/Onboarding/InitialOnboarding/OnboardingPageController.swift
View file @
64c6f640
...
...
@@ -48,8 +48,7 @@ enum OnboardingControllerType {
class
OnboardingPageController
:
UIPageViewController
,
UIScrollViewDelegate
{
private
let
coordinator
:
AppCoordinator
private
let
control
=
OnboardingPageControl
(
totalPagesCount
:
3
)
private
let
pageControl
=
UIPageControl
()
private
let
pageControl
=
OnboardingPageControl
(
totalPagesCount
:
3
)
private
let
closeButton
=
UIButton
()
private
var
pages
=
[
UIViewController
]()
private
let
skipButton
=
SelfSizingButton
()
...
...
@@ -74,16 +73,6 @@ class OnboardingPageController: UIPageViewController, UIScrollViewDelegate {
override
func
viewDidLoad
()
{
super
.
viewDidLoad
()
#if DEBUG
view
.
addSubview
(
control
)
control
.
snp
.
makeConstraints
{
make
in
make
.
top
.
equalToSuperview
()
.
inset
(
80
)
make
.
left
.
equalToSuperview
()
.
inset
(
100
)
}
#else
fatalError
(
"Remove in release"
)
#endif
prepareController
()
prepareCloseButton
()
preparePageControl
()
...
...
@@ -91,7 +80,6 @@ class OnboardingPageController: UIPageViewController, UIScrollViewDelegate {
prepareNextButton
()
prepareDoneButton
()
updateUI
()
control
.
sizeToFit
()
}
override
func
traitCollectionDidChange
(
_
previousTraitCollection
:
UITraitCollection
?)
{
...
...
@@ -123,7 +111,6 @@ class OnboardingPageController: UIPageViewController, UIScrollViewDelegate {
guard
nextIndex
<
pages
.
count
else
{
return
}
setViewControllers
([
pages
[
nextIndex
]],
direction
:
.
forward
,
animated
:
true
)
{[
weak
self
]
_
in
self
?
.
currentPageIndex
=
nextIndex
self
?
.
pageControl
.
currentPage
=
nextIndex
self
?
.
showDoneIfNeeded
(
for
:
nextIndex
)
}
}
...
...
@@ -136,13 +123,11 @@ class OnboardingPageController: UIPageViewController, UIScrollViewDelegate {
closeButton
.
tintColor
=
color
skipButton
.
setTitleColor
(
color
,
for
:
.
normal
)
nextButton
.
tintColor
=
color
pageControl
.
pageIndicatorTintColor
=
UIColor
(
hex
:
0xd0d0d0
)
case
.
dark
:
let
color
=
ThemeManager
.
currentTheme
.
primaryTextColor
closeButton
.
tintColor
=
color
skipButton
.
setTitleColor
(
color
,
for
:
.
normal
)
nextButton
.
tintColor
=
color
pageControl
.
pageIndicatorTintColor
=
UIColor
.
white
}
}
...
...
@@ -178,13 +163,10 @@ private extension OnboardingPageController {
}
func
preparePageControl
()
{
pageControl
.
currentPageIndicatorTintColor
=
.
blue
pageControl
.
currentPage
=
0
pageControl
.
numberOfPages
=
pages
.
count
view
.
addSubview
(
pageControl
)
pageControl
.
snp
.
makeConstraints
{
make
in
make
.
left
.
equalToSuperview
()
.
inset
(
2
0
)
make
.
left
.
equalToSuperview
()
.
inset
(
2
6
)
make
.
bottom
.
equalTo
(
view
.
safeAreaLayoutGuide
.
snp
.
bottom
)
.
offset
(
-
32
)
}
}
...
...
@@ -267,14 +249,15 @@ extension OnboardingPageController {
func
scrollViewDidScroll
(
_
scrollView
:
UIScrollView
)
{
let
pageWidth
=
scrollView
.
contentSize
.
width
/
CGFloat
(
pages
.
count
)
let
progress
=
(
scrollView
.
contentOffset
.
x
-
pageWidth
)
/
pageWidth
print
(
"progress:
\(
progress
)
"
)
let
nextPageIndex
=
progress
<
0
?
currentPageIndex
-
1
:
currentPageIndex
+
1
if
nextPageIndex
>
pages
.
count
-
1
||
nextPageIndex
<
0
{
return
}
control
.
scroll
(
toPage
:
nextPageIndex
,
screenTransitionProgress
:
abs
(
progress
))
pageControl
.
scroll
(
toPage
:
nextPageIndex
,
currentPageIndex
:
currentPageIndex
,
screenTransitionProgress
:
abs
(
progress
))
}
}
...
...
@@ -309,7 +292,6 @@ extension OnboardingPageController: UIPageViewControllerDelegate {
return
}
pageControl
.
currentPage
=
currentPageIndex
self
.
currentPageIndex
=
currentPageIndex
showDoneIfNeeded
(
for
:
currentPageIndex
)
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment