diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index ccf8c1d36..5197f5a03 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -493,7 +493,6 @@ 858276B19C7C0AD4CA98EA78 /* portrait_test_image.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AF042B0FB2EE88977C91E330 /* portrait_test_image.jpg */; }; 858B0A45257174AAFD448EA0 /* MessageComposer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0A01AECFF54281CF35909A6 /* MessageComposer.swift */; }; 858C04B62166B5BAFCD20F2D /* TimelineItemMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1BF12A5E7C76777C4BF0F2B /* TimelineItemMenu.swift */; }; - 85AFBB433AD56704A880F8A0 /* FramePreferenceKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4798B3B7A1E8AE3901CEE8C6 /* FramePreferenceKey.swift */; }; 85F89F3F320F4FADCFFFE68B /* ServerSelectionScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3059CFA00C67D8787273B20 /* ServerSelectionScreenViewModel.swift */; }; 864C0D3A4077BF433DBC691F /* PollRoomTimelineItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5281C5CDC4A712265A0B5FBF /* PollRoomTimelineItem.swift */; }; 864C69CF951BF36D25BE0C03 /* DeveloperOptionsScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D0A27607AB09784C8501B5C /* DeveloperOptionsScreenViewModelTests.swift */; }; @@ -1280,7 +1279,6 @@ 47111410B6E659A697D472B5 /* RoomProxyProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomProxyProtocol.swift; sourceTree = ""; }; 471EB7D96AFEA8D787659686 /* EmoteRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmoteRoomTimelineView.swift; sourceTree = ""; }; 47873756E45B46683D97DC32 /* LegalInformationScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegalInformationScreenModels.swift; sourceTree = ""; }; - 4798B3B7A1E8AE3901CEE8C6 /* FramePreferenceKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FramePreferenceKey.swift; sourceTree = ""; }; 47EBB5D698CE9A25BB553A2D /* Strings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Strings.swift; sourceTree = ""; }; 47F29139BC2A804CE5E0757E /* MediaUploadPreviewScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaUploadPreviewScreenViewModel.swift; sourceTree = ""; }; 490BEADEFB2D6B7C9F618AE8 /* AppLockTimer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockTimer.swift; sourceTree = ""; }; @@ -4294,7 +4292,6 @@ children = ( 8872E9C5E91E9F2BFC4EBCCA /* AlignedScrollView.swift */, 42236480CF0431535EBE8387 /* CustomLayoutLabelStyle.swift */, - 4798B3B7A1E8AE3901CEE8C6 /* FramePreferenceKey.swift */, 565F1B2B300597C616B37888 /* FullscreenDialog.swift */, 49ABAB186CF00B15C5521D04 /* MenuSheetLabelStyle.swift */, 398817652FA8ABAE0A31AC6D /* ReadableFrameModifier.swift */, @@ -5442,7 +5439,6 @@ 4166A7DD2A4E2EFF0EB9369B /* FormRowLabelStyle.swift in Sources */, A0A0D2A9564BDA3FDE2E360F /* FormattedBodyText.swift in Sources */, 0ED691ADC9C2EA457E7A9427 /* FormattingToolbar.swift in Sources */, - 85AFBB433AD56704A880F8A0 /* FramePreferenceKey.swift in Sources */, 46BA7F4B4D3A7164DED44B88 /* FullscreenDialog.swift in Sources */, F18CA61A58C77C84F551B8E7 /* GeneratedMocks.swift in Sources */, B53D292A5CA61E371C4CD785 /* GenericCallLinkCoordinator.swift in Sources */, diff --git a/ElementX/Sources/Other/SwiftUI/Layout/AlignedScrollView.swift b/ElementX/Sources/Other/SwiftUI/Layout/AlignedScrollView.swift index 15c358fa3..ed9dcfcdb 100644 --- a/ElementX/Sources/Other/SwiftUI/Layout/AlignedScrollView.swift +++ b/ElementX/Sources/Other/SwiftUI/Layout/AlignedScrollView.swift @@ -32,6 +32,6 @@ struct AlignedScrollView: View { .frame(minWidth: scrollViewFrame.width, alignment: Alignment(horizontal: alignment, vertical: .center)) } - .background(ViewFrameReader(frame: $scrollViewFrame)) + .readFrame($scrollViewFrame) } } diff --git a/ElementX/Sources/Other/SwiftUI/Layout/FramePreferenceKey.swift b/ElementX/Sources/Other/SwiftUI/Layout/FramePreferenceKey.swift deleted file mode 100644 index 9a3e2b481..000000000 --- a/ElementX/Sources/Other/SwiftUI/Layout/FramePreferenceKey.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// Copyright 2022 New Vector Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import SwiftUI - -/// A SwiftUI `PreferenceKey` for `CGRect` values such as a view's frame. -struct FramePreferenceKey: PreferenceKey { - static var defaultValue: CGRect = .zero - - static func reduce(value: inout CGRect, nextValue: () -> CGRect) { - value = nextValue() - } -} diff --git a/ElementX/Sources/Other/SwiftUI/Layout/ViewFrameReader.swift b/ElementX/Sources/Other/SwiftUI/Layout/ViewFrameReader.swift index bf6b61f25..7907e46be 100644 --- a/ElementX/Sources/Other/SwiftUI/Layout/ViewFrameReader.swift +++ b/ElementX/Sources/Other/SwiftUI/Layout/ViewFrameReader.swift @@ -17,6 +17,16 @@ import Foundation import SwiftUI +extension View { + /// Reads the frame of the view and store it in `frame` binding. + /// - Parameters: + /// - frame: a `CGRect` binding + /// - coordinateSpace: the coordinate space of the frame. + func readFrame(_ frame: Binding, in coordinateSpace: CoordinateSpace = .local) -> some View { + background(ViewFrameReader(frame: frame, coordinateSpace: coordinateSpace)) + } +} + /// Used to calculate the frame of a view. /// /// Useful in situations as with `ZStack` where you might want to layout views using alignment guides. @@ -26,7 +36,7 @@ import SwiftUI /// SomeView() /// .background(ViewFrameReader(frame: $frame)) /// ``` -struct ViewFrameReader: View { +private struct ViewFrameReader: View { @Binding var frame: CGRect var coordinateSpace: CoordinateSpace = .local @@ -43,8 +53,11 @@ struct ViewFrameReader: View { } } -extension View { - func readFrame(_ frame: Binding, in coordinateSpace: CoordinateSpace = .local) -> some View { - background(ViewFrameReader(frame: frame, coordinateSpace: coordinateSpace)) +/// A SwiftUI `PreferenceKey` for `CGRect` values such as a view's frame. +private struct FramePreferenceKey: PreferenceKey { + static var defaultValue: CGRect = .zero + + static func reduce(value: inout CGRect, nextValue: () -> CGRect) { + value = nextValue() } } diff --git a/ElementX/Sources/Screens/ComposerToolbar/View/CompletionSuggestionView.swift b/ElementX/Sources/Screens/ComposerToolbar/View/CompletionSuggestionView.swift index e95e4aa55..6d9f0e69a 100644 --- a/ElementX/Sources/Screens/ComposerToolbar/View/CompletionSuggestionView.swift +++ b/ElementX/Sources/Screens/ComposerToolbar/View/CompletionSuggestionView.swift @@ -42,7 +42,7 @@ struct CompletionSuggestionView: View { } else { ZStack { MentionSuggestionItemView(imageProvider: nil, item: .init(id: "", displayName: nil, avatarURL: nil)) - .background(ViewFrameReader(frame: $prototypeListItemFrame)) + .readFrame($prototypeListItemFrame) .hidden() if showBackgroundShadow { BackgroundView { diff --git a/ElementX/Sources/Screens/ComposerToolbar/View/ComposerToolbar.swift b/ElementX/Sources/Screens/ComposerToolbar/View/ComposerToolbar.swift index 813dd579c..ea217f8a7 100644 --- a/ElementX/Sources/Screens/ComposerToolbar/View/ComposerToolbar.swift +++ b/ElementX/Sources/Screens/ComposerToolbar/View/ComposerToolbar.swift @@ -46,9 +46,7 @@ struct ComposerToolbar: View { } .padding(.leading, 5) .padding(.trailing, 8) - .background { - ViewFrameReader(frame: $frame) - } + .readFrame($frame) .overlay(alignment: .bottom) { if verticalSizeClass != .compact, !context.composerExpanded { suggestionView diff --git a/ElementX/Sources/Screens/ComposerToolbar/View/MessageComposer.swift b/ElementX/Sources/Screens/ComposerToolbar/View/MessageComposer.swift index 19fc8ae11..b97d41824 100644 --- a/ElementX/Sources/Screens/ComposerToolbar/View/MessageComposer.swift +++ b/ElementX/Sources/Screens/ComposerToolbar/View/MessageComposer.swift @@ -71,7 +71,7 @@ struct MessageComposer: View { Color.clear .overlay(alignment: .top) { composerView - .background(ViewFrameReader(frame: $composerFrame)) + .readFrame($composerFrame) } .frame(minHeight: ComposerConstant.minHeight, maxHeight: max(composerHeight, composerFrame.height), alignment: .top) diff --git a/ElementX/Sources/Screens/CreateRoom/View/CreateRoomScreen.swift b/ElementX/Sources/Screens/CreateRoom/View/CreateRoomScreen.swift index 6ab9faeb5..561609142 100644 --- a/ElementX/Sources/Screens/CreateRoom/View/CreateRoomScreen.swift +++ b/ElementX/Sources/Screens/CreateRoom/View/CreateRoomScreen.swift @@ -41,7 +41,7 @@ struct CreateRoomScreen: View { createButton } } - .background(ViewFrameReader(frame: $frame)) + .readFrame($frame) .alert(item: $context.alertInfo) } diff --git a/ElementX/Sources/Screens/InviteUsersScreen/View/InviteUsersScreen.swift b/ElementX/Sources/Screens/InviteUsersScreen/View/InviteUsersScreen.swift index a66740135..a7dc119f6 100644 --- a/ElementX/Sources/Screens/InviteUsersScreen/View/InviteUsersScreen.swift +++ b/ElementX/Sources/Screens/InviteUsersScreen/View/InviteUsersScreen.swift @@ -33,7 +33,7 @@ struct InviteUsersScreen: View { .searchableConfiguration(hidesNavigationBar: false) .compoundSearchField() .alert(item: $context.alertInfo) - .background(ViewFrameReader(frame: $frame)) + .readFrame($frame) } // MARK: - Private