Commit a4f79190 by Dmitriy Stepanets

IOS-211: Added initial onboarding experience with basic sliding UI

parent 68df3bed
No preview for this file type
......@@ -154,10 +154,7 @@
CDC6126625E9085600188DA7 /* GraphLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC6126525E9085600188DA7 /* GraphLine.swift */; };
CDC6126A25E90C8800188DA7 /* GraphLineSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC6126925E90C8800188DA7 /* GraphLineSettings.swift */; };
CDC62C4526C13B9200156643 /* OnboardingPageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC62C4426C13B9200156643 /* OnboardingPageController.swift */; };
CDC62C4726C13BE300156643 /* OnboardingForecastsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC62C4626C13BE300156643 /* OnboardingForecastsController.swift */; };
CDC62C4926C13BFE00156643 /* OnboardingAlertsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC62C4826C13BFE00156643 /* OnboardingAlertsController.swift */; };
CDC62C4B26C13C1700156643 /* OnboardingRadarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC62C4A26C13C1700156643 /* OnboardingRadarController.swift */; };
CDC62C4D26C13E6600156643 /* InitialOnboardingCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC62C4C26C13E6600156643 /* InitialOnboardingCoordinator.swift */; };
CDC62C4726C13BE300156643 /* OnboardingContentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC62C4626C13BE300156643 /* OnboardingContentController.swift */; };
CDD0F1E52572425200CF5017 /* SF-Pro.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CDD0F1E42572425200CF5017 /* SF-Pro.ttf */; };
CDD0F1E82572429E00CF5017 /* AppFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0F1E72572429E00CF5017 /* AppFont.swift */; };
CDD0F1EE25725BCF00CF5017 /* ThemeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0F1ED25725BCF00CF5017 /* ThemeManager.swift */; };
......@@ -414,10 +411,7 @@
CDC6126525E9085600188DA7 /* GraphLine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphLine.swift; sourceTree = "<group>"; };
CDC6126925E90C8800188DA7 /* GraphLineSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphLineSettings.swift; sourceTree = "<group>"; };
CDC62C4426C13B9200156643 /* OnboardingPageController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingPageController.swift; sourceTree = "<group>"; };
CDC62C4626C13BE300156643 /* OnboardingForecastsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingForecastsController.swift; sourceTree = "<group>"; };
CDC62C4826C13BFE00156643 /* OnboardingAlertsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingAlertsController.swift; sourceTree = "<group>"; };
CDC62C4A26C13C1700156643 /* OnboardingRadarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingRadarController.swift; sourceTree = "<group>"; };
CDC62C4C26C13E6600156643 /* InitialOnboardingCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InitialOnboardingCoordinator.swift; sourceTree = "<group>"; };
CDC62C4626C13BE300156643 /* OnboardingContentController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingContentController.swift; sourceTree = "<group>"; };
CDD0F1E42572425200CF5017 /* SF-Pro.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SF-Pro.ttf"; sourceTree = "<group>"; };
CDD0F1E72572429E00CF5017 /* AppFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppFont.swift; sourceTree = "<group>"; };
CDD0F1ED25725BCF00CF5017 /* ThemeManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeManager.swift; sourceTree = "<group>"; };
......@@ -626,7 +620,6 @@
CD7BF1572620410800A30DF5 /* RadarCoordinator.swift */,
CEC8FBB1263976240001A6BF /* OnboardingCoordinator.swift */,
CD8579692671FA8100CC4CDA /* ShortsCoordinator.swift */,
CDC62C4C26C13E6600156643 /* InitialOnboardingCoordinator.swift */,
);
path = Coordinators;
sourceTree = "<group>";
......@@ -1037,9 +1030,7 @@
isa = PBXGroup;
children = (
CDC62C4426C13B9200156643 /* OnboardingPageController.swift */,
CDC62C4626C13BE300156643 /* OnboardingForecastsController.swift */,
CDC62C4826C13BFE00156643 /* OnboardingAlertsController.swift */,
CDC62C4A26C13C1700156643 /* OnboardingRadarController.swift */,
CDC62C4626C13BE300156643 /* OnboardingContentController.swift */,
);
path = InitialOnboarding;
sourceTree = "<group>";
......@@ -1648,7 +1639,6 @@
CD9B6B1425DBCDE2001D9B80 /* GraphView.swift in Sources */,
CD866A6F260F67F200E96A5C /* SettingsDetailsViewModel.swift in Sources */,
CD71709025FA317700A63C27 /* ForecastTimePeriodView.swift in Sources */,
CDC62C4D26C13E6600156643 /* InitialOnboardingCoordinator.swift in Sources */,
CE13B812262480B3007CBD4D /* NativeAdItem.swift in Sources */,
CD37D3E5260CB05C002669D6 /* MenuFooterView.swift in Sources */,
CDE18DD825D16CB200C80ED9 /* NavigationCityButton.swift in Sources */,
......@@ -1692,14 +1682,13 @@
CD37D3FA260DF714002669D6 /* SettingsThemeCell.swift in Sources */,
CD6B303E25726960004B34B3 /* ThemeProtocol.swift in Sources */,
CD6B303B2572680C004B34B3 /* SelfSizingButton.swift in Sources */,
CDC62C4726C13BE300156643 /* OnboardingForecastsController.swift in Sources */,
CDC62C4726C13BE300156643 /* OnboardingContentController.swift in Sources */,
CD9B6B1125DBC723001D9B80 /* CubicCurveAlgorithm.swift in Sources */,
CD8B60B4263819790055CB3F /* NotificationsViewController.swift in Sources */,
CD67617026259D220079D273 /* RadarMapLayersController.swift in Sources */,
CEC8FBAF2639756A0001A6BF /* OnboardingViewController.swift in Sources */,
CD866A65260F642600E96A5C /* SettingsDetailsViewController.swift in Sources */,
CD647D0225ED07D60034578B /* TodayViewModel.swift in Sources */,
CDC62C4926C13BFE00156643 /* OnboardingAlertsController.swift in Sources */,
CD593BD32608BC3F00C93428 /* ForecastDayCell.swift in Sources */,
CD8B60AB263819400055CB3F /* NWSAlertCellFactory.swift in Sources */,
CDAC9B8526319B0500AC1BF4 /* MapTimeControlItem.swift in Sources */,
......@@ -1722,7 +1711,6 @@
CD8B60B3263819790055CB3F /* NWSAlertCell.swift in Sources */,
CE13B81C262480B3007CBD4D /* Interstitial.swift in Sources */,
CDDE8D7C262EED3C00267931 /* MapLegendSevereView.swift in Sources */,
CDC62C4B26C13C1700156643 /* OnboardingRadarController.swift in Sources */,
CD6761882625C3360079D273 /* RadarViewModel.swift in Sources */,
CDF8F12A262089A200DB384A /* MapTimeView.swift in Sources */,
CE81A422266E289E00800EFF /* NativeAdView.swift in Sources */,
......
......@@ -80,15 +80,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
FirebaseApp.configure()
ConfigManager.shared.updateConfig()
#if !DEBUG
fatalError("This code only for Debug")
#else
let onboarding = OnboardingPageController()
window?.rootViewController = onboarding
window?.makeKeyAndVisible()
// let appCoordinator = AppCoordinator(window: self.window!)
// appCoordinator.start()
#endif
let appCoordinator = AppCoordinator(window: self.window!)
appCoordinator.start()
ThemeManager.setBaseTheme()
......
......@@ -98,11 +98,33 @@ class AppCoordinator: Coordinator {
public func finishAnimation() {
DispatchQueue.main.async {
self.window.rootViewController = self.tabBarController
if Settings.shared.initialOnboardingShowed {
self.finishInitialOnboarding()
}
else {
let initialOnboarding = OnboardingPageController(coordinator: self)
self.window.rootViewController = initialOnboarding
UIView.transition(with: self.window,
duration: 0.3,
options: .transitionCrossDissolve,
animations: nil)
}
}
}
public func finishInitialOnboarding() {
DispatchQueue.main.async {
Settings.shared.initialOnboardingShowed = true
self.window.rootViewController = self.tabBarController
UIView.transition(with: self.window,
duration: 0.3,
options: .transitionCrossDissolve,
animations: nil,
completion: {_ in
//Search the TodayCoordinator
let todayCoordinator = (self.childCoordinators.first{$0 is TodayCoordinator} as? TodayCoordinator)
let todayCoordinator = (self.childCoordinators.first{ $0 is TodayCoordinator } as? TodayCoordinator)
todayCoordinator?.showOnboardingOrPrivacyNoticeIfNeeded()
})
}
}
......
//
// InitialOnboardingCoordinator.swift
// 1Weather
//
// Created by Dmitry Stepanets on 09.08.2021.
//
import UIKit
class InitialOnboardingCoordinator: Coordinator {
//Public
var childCoordinators = [Coordinator]()
var parentCoordinator: Coordinator?
//Private
private let parentViewController: UIViewController
init(parentViewController: UIViewController) {
self.parentViewController = parentViewController
}
func start() {
let onboardingController = OnboardingPageController()
parentViewController.present(onboardingController, animated: false)
}
func viewControllerDidEnd(controller: UIViewController) {
parentCoordinator?.childDidFinish(child: self)
}
}
{
"images" : [
{
"filename" : "onboarding-alerts.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}
{
"images" : [
{
"filename" : "onboarding-close.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true,
"template-rendering-intent" : "template"
}
}
{
"images" : [
{
"filename" : "onboarding-forecast.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}
{
"images" : [
{
"filename" : "onboarding-next.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true,
"template-rendering-intent" : "template"
}
}
{
"images" : [
{
"filename" : "onboarding-radar.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}
......@@ -278,3 +278,13 @@
// Ads
"ads.native.sponsored" = "Sponsored";
"ads.placeholder" = "Advertisement";
//Onboarding
"onboarding.skip" = "Skip";
"onboarding.done" = "Done";
"onboarding.forecast.title" = "Extended forecast";
"onboarding.forecast.subtitle" = "<Description>";
"onboarding.alerts.title" = "Weather alerts";
"onboarding.alerts.subtitle" = "<Description>";
"onboarding.radar.title" = "Live doppler radar";
"onboarding.radar.subtitle" = "<Description>";
//
// OnboardingAlertsController.swift
// 1Weather
//
// Created by Dmitry Stepanets on 09.08.2021.
//
import UIKit
class OnboardingAlertsController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .red
}
}
//
// OnboardingContentController.swift
// 1Weather
//
// Created by Dmitry Stepanets on 09.08.2021.
//
import UIKit
class OnboardingContentController: UIViewController {
//Private
private let mainImageView = UIImageView()
private let titleLabel = UILabel()
private let subtitleLabel = UILabel()
init(type: OnboardingControllerType) {
super.init(nibName: nil, bundle: nil)
mainImageView.image = type.image
titleLabel.text = type.title
subtitleLabel.text = type.subtitle
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
prepareImageView()
prepareLables()
updateUI()
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
updateUI()
}
private func updateUI() {
view.backgroundColor = ThemeManager.currentTheme.baseBackgroundColor
subtitleLabel.textColor = ThemeManager.currentTheme.secondaryTextColor
}
}
private extension OnboardingContentController {
func prepareImageView() {
mainImageView.contentMode = .scaleAspectFit
view.addSubview(mainImageView)
mainImageView.snp.makeConstraints { make in
make.bottom.equalToSuperview().multipliedBy(0.56)
make.centerX.equalToSuperview()
make.left.right.equalToSuperview().inset(30)
}
}
func prepareLables() {
titleLabel.font = AppFont.SFPro.semibold(size: 24)
titleLabel.textColor = ThemeManager.currentTheme.graphTintColor
view.addSubview(titleLabel)
subtitleLabel.font = AppFont.SFPro.regular(size: 14)
view.addSubview(subtitleLabel)
//Constraints
titleLabel.snp.makeConstraints { make in
make.left.equalToSuperview().inset(30)
make.bottom.equalToSuperview().multipliedBy(0.7)
}
subtitleLabel.snp.makeConstraints { make in
make.left.equalToSuperview().inset(30)
make.top.equalTo(titleLabel.snp.bottom).offset(10)
}
}
}
//
// OnboardingForecastsController.swift
// 1Weather
//
// Created by Dmitry Stepanets on 09.08.2021.
//
import UIKit
class OnboardingForecastsController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .yellow
}
}
//
// OnboardingRadarController.swift
// 1Weather
//
// Created by Dmitry Stepanets on 09.08.2021.
//
import UIKit
class OnboardingRadarController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .blue
}
}
......@@ -95,6 +95,9 @@ public class Settings {
@UserDefaultsBasicValue(key: "locationDidAdded")
public var locationDidAdded:Bool = false
@UserDefaultsBasicValue(key: "initial_onboarding_showed")
public var initialOnboardingShowed = false
@UserDefaultsBasicValue(key: "shorts_showed_swipeUp_count")
public var shortsSwipeUpNudgeShowedCount = 0
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment