diff --git a/Debaser.xcodeproj/project.pbxproj b/Debaser.xcodeproj/project.pbxproj index 532a039..5ed303e 100644 --- a/Debaser.xcodeproj/project.pbxproj +++ b/Debaser.xcodeproj/project.pbxproj @@ -32,6 +32,7 @@ 85303376262E1E2400C93D1B /* DBSROnboardingStepViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85303371262E1E2400C93D1B /* DBSROnboardingStepViewController.swift */; }; 85303377262E1E2400C93D1B /* DBSROnboardingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85303372262E1E2400C93D1B /* DBSROnboardingViewController.swift */; }; 85303381262E1EF200C93D1B /* OnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85303380262E1EF200C93D1B /* OnboardingView.swift */; }; + 85498DF526659C2800132D92 /* SafeAreaInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85498DF426659C2800132D92 /* SafeAreaInsets.swift */; }; 854E2980262CB3C0003AC567 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 854E296C262CB0C0003AC567 /* Localizable.strings */; }; 854F3A352651627F00FC6BD9 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 854E296C262CB0C0003AC567 /* Localizable.strings */; }; 855090452621FDCB000C88BF /* TabViewRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855090442621FDCB000C88BF /* TabViewRouter.swift */; }; @@ -194,6 +195,7 @@ 85303371262E1E2400C93D1B /* DBSROnboardingStepViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DBSROnboardingStepViewController.swift; sourceTree = ""; }; 85303372262E1E2400C93D1B /* DBSROnboardingViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DBSROnboardingViewController.swift; sourceTree = ""; }; 85303380262E1EF200C93D1B /* OnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingView.swift; sourceTree = ""; }; + 85498DF426659C2800132D92 /* SafeAreaInsets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafeAreaInsets.swift; sourceTree = ""; }; 854E296B262CB0C0003AC567 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 854E2970262CB0C4003AC567 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; 855090442621FDCB000C88BF /* TabViewRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabViewRouter.swift; sourceTree = ""; }; @@ -735,6 +737,7 @@ 85D7D8002619F5150073E3BA /* Helpers */ = { isa = PBXGroup; children = ( + 85498DF426659C2800132D92 /* SafeAreaInsets.swift */, 85EEB96526203FDB00DFC238 /* RoundedCorner.swift */, 852FBE9D26275CF200060A7E /* WillDisappearModifier.swift */, 8587C21F2647AF64005D622C /* DidAppearModifier.swift */, @@ -1048,6 +1051,7 @@ 855310D3260C8BFA00F0D5F7 /* EventListView.swift in Sources */, 855CF3832646DBF7007876D3 /* Theme.swift in Sources */, 855310D8260C8C0600F0D5F7 /* SettingsView.swift in Sources */, + 85498DF526659C2800132D92 /* SafeAreaInsets.swift in Sources */, 85FCAF2A26372E2000A0BC89 /* SpotifyActions.swift in Sources */, 85FCAF15263723FA00A0BC89 /* SpotifyService.swift in Sources */, 8528211E26276BF8007B83EC /* UINavigationController+Extension.swift in Sources */, diff --git a/Debaser/UI/Helpers/RoundedCorner.swift b/Debaser/UI/Helpers/RoundedCorner.swift index c53afd3..273dd84 100644 --- a/Debaser/UI/Helpers/RoundedCorner.swift +++ b/Debaser/UI/Helpers/RoundedCorner.swift @@ -15,6 +15,12 @@ struct RoundedCorner: Shape { var radius: CGFloat = .infinity var corners: UIRectCorner = .allCorners + /// + /// Returns a 2D shape with size of rectangle + /// + /// - parameter rect: Geometry of interest + /// - returns: A shape with rounded corners + /// func path(in rect: CGRect) -> Path { let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, diff --git a/Debaser/UI/Helpers/SafeAreaInsets.swift b/Debaser/UI/Helpers/SafeAreaInsets.swift new file mode 100644 index 0000000..d69f9fb --- /dev/null +++ b/Debaser/UI/Helpers/SafeAreaInsets.swift @@ -0,0 +1,28 @@ +// +// SafeAreaInsets.swift +// Debaser +// +// Created by Markus Bergh on 2021-06-01. +// + +import SwiftUI + +private struct SafeAreaInsetsKey: EnvironmentKey { + static var defaultValue: EdgeInsets { + (UIApplication.shared.windows.first( + where: { $0.isKeyWindow } + )?.safeAreaInsets ?? .zero).insets + } +} + +extension EnvironmentValues { + var safeAreaInsets: EdgeInsets { + self[SafeAreaInsetsKey.self] + } +} + +private extension UIEdgeInsets { + var insets: EdgeInsets { + EdgeInsets(top: top, leading: left, bottom: bottom, trailing: right) + } +} diff --git a/Debaser/UI/Settings/SettingsAboutView.swift b/Debaser/UI/Settings/SettingsAboutView.swift index 3a092ea..b802821 100644 --- a/Debaser/UI/Settings/SettingsAboutView.swift +++ b/Debaser/UI/Settings/SettingsAboutView.swift @@ -8,6 +8,11 @@ import SwiftUI struct SettingsAboutView: View { + + // MARK: Private + + @Environment(\.safeAreaInsets) private var safeAreaInsets + private var historyTitle: LocalizedStringKey { return "Settings.Debaser.History.Title" } @@ -18,11 +23,11 @@ struct SettingsAboutView: View { private var bottomPadding: CGFloat { // Unfornately some hard coding values needed here... - guard let safeAreaInsets = UIApplication.shared.windows.first?.safeAreaInsets, safeAreaInsets.bottom > 0 else { - return TabBarStyle.height.rawValue + TabBarStyle.insetPadding.rawValue + TabBarStyle.paddingBottom.rawValue + 15 + 10 + if safeAreaInsets.bottom > 0 { + return TabBarStyle.height.rawValue + TabBarStyle.insetPadding.rawValue + TabBarStyle.paddingBottom.rawValue + 5 } - return TabBarStyle.height.rawValue + TabBarStyle.insetPadding.rawValue + TabBarStyle.paddingBottom.rawValue + return TabBarStyle.height.rawValue + TabBarStyle.insetPadding.rawValue + TabBarStyle.paddingBottom.rawValue + 10 + 20 } var body: some View { diff --git a/Debaser/UI/SettingsView.swift b/Debaser/UI/SettingsView.swift index 1c2a937..11195d5 100644 --- a/Debaser/UI/SettingsView.swift +++ b/Debaser/UI/SettingsView.swift @@ -9,10 +9,11 @@ import SwiftUI struct SettingsView: View { @EnvironmentObject var store: AppStore - + // MARK: Private @State private var isAlertPresented = false + @Environment(\.safeAreaInsets) private var safeAreaInsets private var titleLabel: LocalizedStringKey { return "Settings" @@ -30,40 +31,6 @@ struct SettingsView: View { return darkMode.wrappedValue } - private var bottomPadding: CGFloat { - guard let safeAreaInsets = UIApplication.shared.windows.first?.safeAreaInsets, safeAreaInsets.bottom > 0 else { - return 15 - } - - return safeAreaInsets.bottom - } - - private var systemColorScheme: Binding { - return Binding( - get: { - return store.state.settings.systemColorScheme.value - }, - set: { newValue in - withAnimation { - store.dispatch(action:.settings(.setOverrideColorScheme(newValue))) - } - } - ) - } - - private var darkMode: Binding { - return Binding( - get: { - return store.state.settings.darkMode.value - }, - set: { newValue in - withAnimation { - store.dispatch(action:.settings(.setDarkMode(newValue))) - } - } - ) - } - init() { UITableView.appearance().backgroundColor = .clear } @@ -141,6 +108,38 @@ struct SettingsView: View { } } +// MARK: - Bindings + +extension SettingsView { + + private var systemColorScheme: Binding { + return Binding( + get: { + return store.state.settings.systemColorScheme.value + }, + set: { newValue in + withAnimation { + store.dispatch(action:.settings(.setOverrideColorScheme(newValue))) + } + } + ) + } + + private var darkMode: Binding { + return Binding( + get: { + return store.state.settings.darkMode.value + }, + set: { newValue in + withAnimation { + store.dispatch(action:.settings(.setDarkMode(newValue))) + } + } + ) + } + +} + struct SettingsViewTopRectangle: View { // MARK: Public