5f1d49b0bd
Partially solves #281. This adds a new example app which mimics the Maps.app, written in SwiftUI. The code works for iOS 13+, however: * the project has been created with Xcode 13 * the project uses the SwiftUI lifecycle (iOS 14+) The source code in Examples/Maps-SwiftUI/Maps/FloatingPanel is ready to move into the library, but there is an issue on SwiftUI’s environment propagation into FloatingPanel. SwiftUI’s environment is propagated to all subviews. However FloatingPanel is not a subview, but a new view controller in the screen (and not a child view controller). It’s possible to lead behaviors unexpected by SwiftUI users so that this is merged as a sample code until it will be resolved.
44 lines
1.4 KiB
Swift
44 lines
1.4 KiB
Swift
// Copyright 2021 the FloatingPanel authors. All rights reserved. MIT license.
|
||
|
||
import SwiftUI
|
||
|
||
struct FloatingPanelContentView: View {
|
||
@State private var searchText = ""
|
||
@State private var isShowingCancelButton = false
|
||
var proxy: FloatingPanelProxy
|
||
|
||
var body: some View {
|
||
VStack(spacing: 0) {
|
||
searchBar
|
||
resultsList
|
||
}
|
||
// 👇🏻 for the floating panel grabber handle.
|
||
.padding(.top, 6)
|
||
.background(
|
||
VisualEffectBlur(blurStyle: .systemMaterial)
|
||
// ⚠️ If the `VisualEffectBlur` view receives taps, it's going
|
||
// to mess up with the whole panel and render it
|
||
// non-interactive, make sure it never receives any taps.
|
||
.allowsHitTesting(false)
|
||
)
|
||
.ignoresSafeArea()
|
||
}
|
||
|
||
var searchBar: some View {
|
||
SearchBar(
|
||
"Search for a place or address",
|
||
text: $searchText,
|
||
isShowingCancelButton: $isShowingCancelButton
|
||
) { isFocused in
|
||
proxy.move(to: isFocused ? .full : .half, animated: true)
|
||
isShowingCancelButton = isFocused
|
||
} onCancel: {
|
||
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
|
||
}
|
||
}
|
||
|
||
var resultsList: some View {
|
||
ResultsList(onScrollViewCreated: proxy.track(scrollView:))
|
||
}
|
||
}
|