From 45d88b4cf6888b6c4f10bc3eda8e4faaad7fd8d1 Mon Sep 17 00:00:00 2001 From: Boyko Mihail Date: Wed, 23 Sep 2020 13:42:38 +0300 Subject: [PATCH] Add orientation viewController Extension --- LeadKit.xcodeproj/project.pbxproj | 16 ++++++++++ .../BaseConfigurableController.swift | 30 +++++++++++++++++++ .../BaseOrientationNavigationController.swift | 25 ++++++++++++++++ .../Alamofire/DataRequest+Extensions.swift | 2 +- .../UIDevice/UIDevice+ScreenOrientation.swift | 14 +++++++++ 5 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 Sources/Classes/Controllers/BaseOrientationNavigationController.swift create mode 100644 Sources/Extensions/UIKit/UIDevice/UIDevice+ScreenOrientation.swift diff --git a/LeadKit.xcodeproj/project.pbxproj b/LeadKit.xcodeproj/project.pbxproj index e040f794..7a65525e 100644 --- a/LeadKit.xcodeproj/project.pbxproj +++ b/LeadKit.xcodeproj/project.pbxproj @@ -23,6 +23,8 @@ 52421F8F24EAB84900948DD1 /* BaseRxTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52421F8E24EAB84900948DD1 /* BaseRxTableViewCell.swift */; }; 52421F9424EBCFAE00948DD1 /* VoidTappableViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52421F9324EBCFAE00948DD1 /* VoidTappableViewModel.swift */; }; 52421F9624EBCFBB00948DD1 /* BaseTappableViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52421F9524EBCFBB00948DD1 /* BaseTappableViewModel.swift */; }; + 5ED2C0B2251A354E00D4E258 /* BaseOrientationNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5ED2C0B1251A354E00D4E258 /* BaseOrientationNavigationController.swift */; }; + 5ED2C0B5251A366700D4E258 /* UIDevice+ScreenOrientation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5ED2C0B4251A366700D4E258 /* UIDevice+ScreenOrientation.swift */; }; 67051ADB1EBC7C36008EADC0 /* SpinnerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67051ADA1EBC7C36008EADC0 /* SpinnerView.swift */; }; 67051ADD1EBC7C36008EADC0 /* SpinnerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67051ADA1EBC7C36008EADC0 /* SpinnerView.swift */; }; 6713C23720AF0C4D00875921 /* NetworkOperationState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6713C23620AF0C4D00875921 /* NetworkOperationState.swift */; }; @@ -561,6 +563,8 @@ 52421F8E24EAB84900948DD1 /* BaseRxTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseRxTableViewCell.swift; sourceTree = ""; }; 52421F9324EBCFAE00948DD1 /* VoidTappableViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoidTappableViewModel.swift; sourceTree = ""; }; 52421F9524EBCFBB00948DD1 /* BaseTappableViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseTappableViewModel.swift; sourceTree = ""; }; + 5ED2C0B1251A354E00D4E258 /* BaseOrientationNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseOrientationNavigationController.swift; sourceTree = ""; }; + 5ED2C0B4251A366700D4E258 /* UIDevice+ScreenOrientation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDevice+ScreenOrientation.swift"; sourceTree = ""; }; 67051ADA1EBC7C36008EADC0 /* SpinnerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpinnerView.swift; sourceTree = ""; }; 6713C23620AF0C4D00875921 /* NetworkOperationState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkOperationState.swift; sourceTree = ""; }; 6713C23B20AF0D5900875921 /* NetworkOperationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkOperationModel.swift; sourceTree = ""; }; @@ -910,6 +914,14 @@ path = TappableViewModel; sourceTree = ""; }; + 5ED2C0B3251A365800D4E258 /* UIDevice */ = { + isa = PBXGroup; + children = ( + 5ED2C0B4251A366700D4E258 /* UIDevice+ScreenOrientation.swift */, + ); + path = UIDevice; + sourceTree = ""; + }; 671461C41EB3396E00EAB194 /* Classes */ = { isa = PBXGroup; children = ( @@ -1375,6 +1387,7 @@ 672947E0206EA36B00AC6B6B /* UIKit */ = { isa = PBXGroup; children = ( + 5ED2C0B3251A365800D4E258 /* UIDevice */, 6741CEB220E242B600FEC4D9 /* CollectionViewHolder */, 6741CEAD20E2428A00FEC4D9 /* TableViewHolder */, 674AF55A1EC45B1600038A8F /* UIActivityIndicatorView */, @@ -1535,6 +1548,7 @@ 6741CECC20E243F800FEC4D9 /* BaseCustomViewController.swift */, 675E0AA821072FF400CDC143 /* BaseScrollContentController.swift */, 67DB776321086A12001CB56B /* BaseTableContentController.swift */, + 5ED2C0B1251A354E00D4E258 /* BaseOrientationNavigationController.swift */, ); path = Controllers; sourceTree = ""; @@ -2484,6 +2498,7 @@ 6774528D20625C9E0024EEEF /* GeneralDataLoadingState.swift in Sources */, 72005A1F2266226800ECE090 /* CustomizableButtonViewModel.swift in Sources */, 677B06C4211884F3006C947D /* BaseTextAttributes.swift in Sources */, + 5ED2C0B2251A354E00D4E258 /* BaseOrientationNavigationController.swift in Sources */, 675E0AA921072FF400CDC143 /* BaseScrollContentController.swift in Sources */, 671463901EB3396E00EAB194 /* TemplateDrawingOperation.swift in Sources */, A658E54D1F8CD7790093527A /* TableRow+SeparatorsExtensions.swift in Sources */, @@ -2525,6 +2540,7 @@ 67E902572125B66E008EDF45 /* UIImageView+ExpandCollapseDisclosure.swift in Sources */, 671462781EB3396E00EAB194 /* ResizeMode.swift in Sources */, 67E902512125B064008EDF45 /* BuildInNumberTypes+NSNumberConvertible.swift in Sources */, + 5ED2C0B5251A366700D4E258 /* UIDevice+ScreenOrientation.swift in Sources */, A676AE551F98112E001F9214 /* ObservableMappable.swift in Sources */, 6741CEA520E2418200FEC4D9 /* TableViewHolder.swift in Sources */, 8546C2E3224E86280059C255 /* ApiUploadRequestParameters.swift in Sources */, diff --git a/Sources/Classes/Controllers/BaseConfigurableController.swift b/Sources/Classes/Controllers/BaseConfigurableController.swift index 9c3ee826..40ad1f7f 100644 --- a/Sources/Classes/Controllers/BaseConfigurableController.swift +++ b/Sources/Classes/Controllers/BaseConfigurableController.swift @@ -25,9 +25,39 @@ import UIKit.UIViewController /// Base controller that should be configured with view model. open class BaseConfigurableController: UIViewController, ConfigurableController { + /// Ability to set forced screen orientation + open var forcedInterfaceOrientation: UIInterfaceOrientation? + /// A view model instance used by this controller. public let viewModel: ViewModel + override var interfaceOrientation: UIInterfaceOrientation { + return forcedInterfaceOrientation ?? super.interfaceOrientation + } + + open override var supportedInterfaceOrientations: UIInterfaceOrientationMask { + switch interfaceOrientation { + case .landscapeLeft: + return .landscapeLeft + + case .landscapeRight: + return .landscapeRight + + case .portrait: + return .portrait + + case .portraitUpsideDown: + return .portraitUpsideDown + + default: + return .portrait + } + } + + open override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { + return interfaceOrientation + } + /// Initializer with view model parameter. /// /// - Parameter viewModel: A view model to configure this controller. diff --git a/Sources/Classes/Controllers/BaseOrientationNavigationController.swift b/Sources/Classes/Controllers/BaseOrientationNavigationController.swift new file mode 100644 index 00000000..342a8885 --- /dev/null +++ b/Sources/Classes/Controllers/BaseOrientationNavigationController.swift @@ -0,0 +1,25 @@ +import RxSwift +import UIKit + +open class OrientationNavigationController: UINavigationController { + + // MARK: - Public properties + + open override var shouldAutorotate: Bool { + return presentedViewController?.shouldAutorotate + ?? topViewController?.shouldAutorotate + ?? false + } + + open override var supportedInterfaceOrientations: UIInterfaceOrientationMask { + return presentedViewController?.supportedInterfaceOrientations + ?? topViewController?.supportedInterfaceOrientations + ?? .portrait + } + + open override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { + return presentedViewController?.preferredInterfaceOrientationForPresentation + ?? topViewController?.preferredInterfaceOrientationForPresentation + ?? .portrait + } +} diff --git a/Sources/Extensions/Alamofire/DataRequest+Extensions.swift b/Sources/Extensions/Alamofire/DataRequest+Extensions.swift index 4ecf988f..90bc6da8 100644 --- a/Sources/Extensions/Alamofire/DataRequest+Extensions.swift +++ b/Sources/Extensions/Alamofire/DataRequest+Extensions.swift @@ -142,7 +142,7 @@ private extension ObservableType { default: resultError = .network(error: error, response: response) } - + case .responseSerializationFailed, .responseValidationFailed: resultError = .invalidResponse(error: afError, response: response) diff --git a/Sources/Extensions/UIKit/UIDevice/UIDevice+ScreenOrientation.swift b/Sources/Extensions/UIKit/UIDevice/UIDevice+ScreenOrientation.swift new file mode 100644 index 00000000..49ba8e33 --- /dev/null +++ b/Sources/Extensions/UIKit/UIDevice/UIDevice+ScreenOrientation.swift @@ -0,0 +1,14 @@ +import UIKit + +public extension UIDevice { + + /// Вручную повернуть экран устройства + /// + /// - Parameters: + /// - orientation: ориентация в терминах ScreenOrientation + func rotateOrientationManually(to orientation: UIInterfaceOrientation) { + let orientationValue = Int(orientation.rawValue) + UIDevice.current.setValue(orientationValue, forKey: "orientation") + UIViewController.attemptRotationToDeviceOrientation() + } +}