Refactor frame reader API (#2016)

This commit is contained in:
Alfonso Grillo
2023-11-02 15:15:57 +01:00
committed by GitHub
parent 14badab01f
commit 4012aca661
9 changed files with 23 additions and 42 deletions
-4
View File
@@ -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 = "<group>"; };
471EB7D96AFEA8D787659686 /* EmoteRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmoteRoomTimelineView.swift; sourceTree = "<group>"; };
47873756E45B46683D97DC32 /* LegalInformationScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegalInformationScreenModels.swift; sourceTree = "<group>"; };
4798B3B7A1E8AE3901CEE8C6 /* FramePreferenceKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FramePreferenceKey.swift; sourceTree = "<group>"; };
47EBB5D698CE9A25BB553A2D /* Strings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Strings.swift; sourceTree = "<group>"; };
47F29139BC2A804CE5E0757E /* MediaUploadPreviewScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaUploadPreviewScreenViewModel.swift; sourceTree = "<group>"; };
490BEADEFB2D6B7C9F618AE8 /* AppLockTimer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockTimer.swift; sourceTree = "<group>"; };
@@ -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 */,
@@ -32,6 +32,6 @@ struct AlignedScrollView<Content: View>: View {
.frame(minWidth: scrollViewFrame.width,
alignment: Alignment(horizontal: alignment, vertical: .center))
}
.background(ViewFrameReader(frame: $scrollViewFrame))
.readFrame($scrollViewFrame)
}
}
@@ -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()
}
}
@@ -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<CGRect>, 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<CGRect>, 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()
}
}
@@ -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 {
@@ -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
@@ -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)
@@ -41,7 +41,7 @@ struct CreateRoomScreen: View {
createButton
}
}
.background(ViewFrameReader(frame: $frame))
.readFrame($frame)
.alert(item: $context.alertInfo)
}
@@ -33,7 +33,7 @@ struct InviteUsersScreen: View {
.searchableConfiguration(hidesNavigationBar: false)
.compoundSearchField()
.alert(item: $context.alertInfo)
.background(ViewFrameReader(frame: $frame))
.readFrame($frame)
}
// MARK: - Private