mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 16:10:20 +00:00
Refactor frame reader API (#2016)
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user