diff --git a/Classes/Login/LoginSplashViewController.swift b/Classes/Login/LoginSplashViewController.swift index d39771e52..f0b514cfb 100644 --- a/Classes/Login/LoginSplashViewController.swift +++ b/Classes/Login/LoginSplashViewController.swift @@ -24,6 +24,7 @@ final class LoginSplashViewController: UIViewController, GitHubSessionListener { private var client: Client! private var sessionManager: GitHubSessionManager! + @IBOutlet weak var splashView: SplashView! @IBOutlet weak var signInButton: UIButton! @IBOutlet weak var activityIndicator: UIActivityIndicatorView! private weak var safariController: SFSafariViewController? @@ -62,6 +63,12 @@ final class LoginSplashViewController: UIViewController, GitHubSessionListener { sessionManager.addListener(listener: self) signInButton.layer.cornerRadius = Styles.Sizes.eventGutter } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + setupSplashView() + } // MARK: Public API @@ -137,6 +144,10 @@ final class LoginSplashViewController: UIViewController, GitHubSessionListener { dismiss: true ) } + + private func setupSplashView() { + splashView.configureView() + } // MARK: GitHubSessionListener diff --git a/Classes/Login/OauthLogin.storyboard b/Classes/Login/OauthLogin.storyboard index 6afa9fb1f..70b3c8225 100644 --- a/Classes/Login/OauthLogin.storyboard +++ b/Classes/Login/OauthLogin.storyboard @@ -1,19 +1,14 @@ - + - + - - - AvenirNext-DemiBold - - @@ -37,25 +32,25 @@ - - + + - + - + - + - - - diff --git a/Classes/Login/SplashView/SplashView.swift b/Classes/Login/SplashView/SplashView.swift new file mode 100644 index 000000000..b8a17273e --- /dev/null +++ b/Classes/Login/SplashView/SplashView.swift @@ -0,0 +1,82 @@ +// +// SplashView.swift +// Freetime +// +// Created by Yury Bogdanov on 25/07/2018. +// Copyright © 2018 Ryan Nystrom. All rights reserved. +// + +import UIKit +import SnapKit + +final class SplashView: UIView { + + // MARK: Private properties + + private var birdImageView: UIImageView! + private var branchesImageView: UIImageView! + + + // MARK: Public API + + override init(frame: CGRect) { + super.init(frame: frame) + + setupView() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + + setupView() + } + + func configureView() { + addBirdAnimation() + addBranchesAnimation() + } + + + // MARK: Private API + + private func setupView() { + branchesImageView = UIImageView(image: UIImage(named: "splash_branches")) + addSubview(branchesImageView) + branchesImageView.snp.makeConstraints { make in + make.top.left.right.bottom.equalToSuperview() + } + + birdImageView = UIImageView(image: UIImage(named: "splash")) + addSubview(birdImageView) + birdImageView.snp.makeConstraints { make in + make.top.left.right.bottom.equalToSuperview().inset(30) + } + } + + private func addBirdAnimation() { + let pulseAnimation = CABasicAnimation(keyPath: "transform.scale") + + pulseAnimation.autoreverses = true + pulseAnimation.repeatCount = .infinity + pulseAnimation.fromValue = 1.0 + pulseAnimation.toValue = 0.9 + pulseAnimation.duration = 2 + pulseAnimation.fillMode = kCAFillModeForwards + pulseAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) + + birdImageView.layer.add(pulseAnimation, forKey: "scaling") + } + + private func addBranchesAnimation() { + let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation") + + rotateAnimation.repeatCount = .infinity + rotateAnimation.byValue = 2 * Double.pi + rotateAnimation.duration = 120 + rotateAnimation.fillMode = kCAFillModeForwards + rotateAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) + + branchesImageView.layer.add(rotateAnimation, forKey: "rotation") + } + +} diff --git a/Freetime.xcodeproj/project.pbxproj b/Freetime.xcodeproj/project.pbxproj index 7b27325b8..b3a7076a2 100644 --- a/Freetime.xcodeproj/project.pbxproj +++ b/Freetime.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 15245487205DC016005810A6 /* IssueTargetBranchModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15245484205DC016005810A6 /* IssueTargetBranchModel.swift */; }; 15245488205DC016005810A6 /* IssueBranchesSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15245485205DC016005810A6 /* IssueBranchesSectionController.swift */; }; 15245489205DC016005810A6 /* IssueTargetBranchCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15245486205DC016005810A6 /* IssueTargetBranchCell.swift */; }; + 15F28F992108DBA6006421B6 /* SplashView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F28F982108DBA6006421B6 /* SplashView.swift */; }; 290056F3210028B20046EAE5 /* UIViewController+MenuDone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290056F2210028B20046EAE5 /* UIViewController+MenuDone.swift */; }; 2905AFAB1F7357B40015AE32 /* RepositoryOverviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2905AFAA1F7357B40015AE32 /* RepositoryOverviewViewController.swift */; }; 2905AFAD1F7357C50015AE32 /* RepositoryIssuesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2905AFAC1F7357C50015AE32 /* RepositoryIssuesViewController.swift */; }; @@ -511,6 +512,7 @@ 15245484205DC016005810A6 /* IssueTargetBranchModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = IssueTargetBranchModel.swift; path = Classes/Issues/Branches/IssueTargetBranchModel.swift; sourceTree = SOURCE_ROOT; }; 15245485205DC016005810A6 /* IssueBranchesSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = IssueBranchesSectionController.swift; path = Classes/Issues/Branches/IssueBranchesSectionController.swift; sourceTree = SOURCE_ROOT; }; 15245486205DC016005810A6 /* IssueTargetBranchCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = IssueTargetBranchCell.swift; path = Classes/Issues/Branches/IssueTargetBranchCell.swift; sourceTree = SOURCE_ROOT; }; + 15F28F982108DBA6006421B6 /* SplashView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashView.swift; sourceTree = ""; }; 290056F2210028B20046EAE5 /* UIViewController+MenuDone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+MenuDone.swift"; sourceTree = ""; }; 2905AFAA1F7357B40015AE32 /* RepositoryOverviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RepositoryOverviewViewController.swift; sourceTree = ""; }; 2905AFAC1F7357C50015AE32 /* RepositoryIssuesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RepositoryIssuesViewController.swift; sourceTree = ""; }; @@ -1025,6 +1027,14 @@ path = "New Group"; sourceTree = ""; }; + 15F28F972108DB8C006421B6 /* SplashView */ = { + isa = PBXGroup; + children = ( + 15F28F982108DBA6006421B6 /* SplashView.swift */, + ); + path = SplashView; + sourceTree = ""; + }; 290744B01F250A1D00FD9E48 /* Autocomplete */ = { isa = PBXGroup; children = ( @@ -1549,6 +1559,7 @@ 297AE8581EC0D5C100B44A1F /* Login */ = { isa = PBXGroup; children = ( + 15F28F972108DB8C006421B6 /* SplashView */, 299F4A88204CEDDC004BA4F0 /* Client+AccessToken.swift */, 29416BFA1F113D0A00D03E1A /* LoginSplashViewController.swift */, 29416BF81F1138B700D03E1A /* OauthLogin.storyboard */, @@ -2671,6 +2682,7 @@ 29B94E6D1FCB472400715D7E /* IssueFileChangesModel.swift in Sources */, 986B87191F2B875800AAB55C /* GithubClient+Search.swift in Sources */, 29C0E7071ECBC6C50051D756 /* GithubClient.swift in Sources */, + 15F28F992108DBA6006421B6 /* SplashView.swift in Sources */, 2986B35A1FD30F0B00E3CFC6 /* IssueManagingModel.swift in Sources */, 2981A8A41EFE9FC700E25EF1 /* GithubEmoji.swift in Sources */, 2924C18B20D5B3A100FCFCFF /* LabelMenuCell.swift in Sources */, diff --git a/Resources/Assets.xcassets/splash_branches.imageset/Contents.json b/Resources/Assets.xcassets/splash_branches.imageset/Contents.json new file mode 100644 index 000000000..6eee64548 --- /dev/null +++ b/Resources/Assets.xcassets/splash_branches.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "splash_branches@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "splash_branches@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Resources/Assets.xcassets/splash_branches.imageset/splash_branches@2x.png b/Resources/Assets.xcassets/splash_branches.imageset/splash_branches@2x.png new file mode 100644 index 000000000..ed758c5fe Binary files /dev/null and b/Resources/Assets.xcassets/splash_branches.imageset/splash_branches@2x.png differ diff --git a/Resources/Assets.xcassets/splash_branches.imageset/splash_branches@3x.png b/Resources/Assets.xcassets/splash_branches.imageset/splash_branches@3x.png new file mode 100644 index 000000000..0b41c89eb Binary files /dev/null and b/Resources/Assets.xcassets/splash_branches.imageset/splash_branches@3x.png differ