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:))
|
|
}
|
|
}
|