From 24591cee05b04f3c7b5b7128682fa8dcdba360e7 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Mon, 1 Aug 2022 21:29:24 -0400 Subject: [PATCH] Improve account switching animation --- Tusker.xcodeproj/project.pbxproj | 17 ++++++++++++++ ...ountSwitchingContainerViewController.swift | 23 ++++++++++++++++--- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/Tusker.xcodeproj/project.pbxproj b/Tusker.xcodeproj/project.pbxproj index 196af288..3720de65 100644 --- a/Tusker.xcodeproj/project.pbxproj +++ b/Tusker.xcodeproj/project.pbxproj @@ -121,6 +121,7 @@ D6531DF0246B867E000F9538 /* GifvAttachmentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6531DEF246B867E000F9538 /* GifvAttachmentViewController.swift */; }; D6538945214D6D7500E3CEFC /* TableViewSwipeActionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6538944214D6D7500E3CEFC /* TableViewSwipeActionProvider.swift */; }; D653F411267D1E32004E32B1 /* DiffableTimelineLikeTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D653F410267D1E32004E32B1 /* DiffableTimelineLikeTableViewController.swift */; }; + D6552367289870790048A653 /* ScreenCorners in Frameworks */ = {isa = PBXBuildFile; productRef = D6552366289870790048A653 /* ScreenCorners */; }; D65C6BF525478A9C00A6E89C /* BackgroundableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D65C6BF425478A9C00A6E89C /* BackgroundableViewController.swift */; }; D65F613423AEAB6600F3CFD3 /* OnboardingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D65F613323AEAB6600F3CFD3 /* OnboardingTests.swift */; }; D6620ACE2511A0ED00312CA0 /* StatusStateResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6620ACD2511A0ED00312CA0 /* StatusStateResolver.swift */; }; @@ -668,6 +669,7 @@ D674A50927F9128D00BA03AC /* Pachyderm in Frameworks */, D69CCBBF249E6EFD000AF167 /* CrashReporter in Frameworks */, D60CFFDB24A290BA00D00083 /* SwiftSoup in Frameworks */, + D6552367289870790048A653 /* ScreenCorners in Frameworks */, D6676CA527A8D0020052936B /* WebURLFoundationExtras in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1506,6 +1508,7 @@ D60CFFDA24A290BA00D00083 /* SwiftSoup */, D6676CA427A8D0020052936B /* WebURLFoundationExtras */, D674A50827F9128D00BA03AC /* Pachyderm */, + D6552366289870790048A653 /* ScreenCorners */, ); productName = Tusker; productReference = D6D4DDCC212518A000E1C4BB /* Tusker.app */; @@ -1614,6 +1617,7 @@ D69CCBBD249E6EFD000AF167 /* XCRemoteSwiftPackageReference "plcrashreporter" */, D60CFFD924A290BA00D00083 /* XCRemoteSwiftPackageReference "SwiftSoup" */, D6676CA127A8D0020052936B /* XCRemoteSwiftPackageReference "swift-url" */, + D6552365289870790048A653 /* XCRemoteSwiftPackageReference "ScreenCorners" */, ); productRefGroup = D6D4DDCD212518A000E1C4BB /* Products */; projectDirPath = ""; @@ -2443,6 +2447,14 @@ minimumVersion = 2.3.2; }; }; + D6552365289870790048A653 /* XCRemoteSwiftPackageReference "ScreenCorners" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/kylebshr/ScreenCorners"; + requirement = { + kind = upToNextMinorVersion; + minimumVersion = 1.0.1; + }; + }; D6676CA127A8D0020052936B /* XCRemoteSwiftPackageReference "swift-url" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/karwa/swift-url"; @@ -2467,6 +2479,11 @@ package = D60CFFD924A290BA00D00083 /* XCRemoteSwiftPackageReference "SwiftSoup" */; productName = SwiftSoup; }; + D6552366289870790048A653 /* ScreenCorners */ = { + isa = XCSwiftPackageProductDependency; + package = D6552365289870790048A653 /* XCRemoteSwiftPackageReference "ScreenCorners" */; + productName = ScreenCorners; + }; D6676CA427A8D0020052936B /* WebURLFoundationExtras */ = { isa = XCSwiftPackageProductDependency; package = D6676CA127A8D0020052936B /* XCRemoteSwiftPackageReference "swift-url" */; diff --git a/Tusker/Screens/Main/AccountSwitchingContainerViewController.swift b/Tusker/Screens/Main/AccountSwitchingContainerViewController.swift index d5571da9..58b93249 100644 --- a/Tusker/Screens/Main/AccountSwitchingContainerViewController.swift +++ b/Tusker/Screens/Main/AccountSwitchingContainerViewController.swift @@ -7,6 +7,7 @@ // import UIKit +import ScreenCorners class AccountSwitchingContainerViewController: UIViewController { @@ -49,14 +50,30 @@ class AccountSwitchingContainerViewController: UIViewController { } else { let sign: CGFloat = direction == .downwards ? -1 : 1 let newInitialOffset = sign * view.bounds.height + let scale: CGFloat = 0.75 - newRoot.view.transform = CGAffineTransform(translationX: 0, y: newInitialOffset) + newRoot.view.transform = CGAffineTransform(translationX: 0, y: newInitialOffset).scaledBy(x: 0.9, y: 0.9) + newRoot.view.layer.masksToBounds = true + newRoot.view.layer.cornerCurve = .continuous + newRoot.view.layer.cornerRadius = view.window?.screen.displayCornerRadius ?? 0 - UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut) { + oldRoot.view.layer.masksToBounds = true + oldRoot.view.layer.cornerCurve = .continuous + oldRoot.view.layer.cornerRadius = view.window?.screen.displayCornerRadius ?? 0 + + // only one edge is affected in each direction, i have no idea why + if direction == .upwards { + oldRoot.additionalSafeAreaInsets.bottom = view.safeAreaInsets.bottom + } else { + oldRoot.additionalSafeAreaInsets.top = view.safeAreaInsets.top + } + + UIView.animate(withDuration: 0.4, delay: 0, options: .curveEaseInOut) { + oldRoot.view.transform = CGAffineTransform(translationX: 0, y: -newInitialOffset).scaledBy(x: scale, y: scale) newRoot.view.transform = .identity - oldRoot.view.transform = CGAffineTransform(translationX: 0, y: -newInitialOffset) } completion: { (_) in oldRoot.removeViewAndController() + newRoot.view.layer.masksToBounds = false } } }