【问题标题】:Google Maps iOS SDK animate map padding SwiftUIGoogle Maps iOS SDK 动画地图填充 SwiftUI
【发布时间】:2021-12-06 18:07:27
【问题描述】:

我希望为我的 Google 地图的填充设置动画,因为当底部工作表出现时,地图填充会动态调整大小。

GMSMapView.padding documentation 说它可以通过基于 UIView 块的动画来完成,但我不确定这将如何与 SwiftUI 应用程序联系起来?

底部工作表工作正常,它按预期显示并将正确的填充值传递给 MapView。这只是我无法理解的动画。 (如果你好奇的话,底部表格使用这个组件https://github.com/LucasMucGH/BottomSheet

任何帮助将不胜感激,谢谢。

当前相关代码:

struct MapView: UIViewRepresentable {
  
  var bottomPadding: CGFloat
  private let mapView = GMSMapView(frame: .zero)
  
  func makeUIView(context: Context) -> GMSMapView {
    return mapView
  }

  func updateUIView(_ mapView: GMSMapView, context: Context) {
    mapView.padding = UIEdgeInsets(top: 0, left: 0, bottom: bottomPadding, right: 0)
  }
}

struct ContentView: View {
  
  @State var showBottomSheet: ShowBottomSheet = .hidden
  
  var bottomSheetHeight: CGFloat {
    if showBottomSheet == .visible {
      return showBottomSheet.rawValue
    } else {
      return 0
    }
  }
  
  var body: some View {
        
    GeometryReader { geometry in
      ZStack {
        
        // Map
        MapView(bottomPadding: geometry.size.height * bottomSheetHeight)
        .edgesIgnoringSafeArea(.all)
        .bottomSheet(
          bottomSheetPosition: $showBottomSheet,
          options: [
            .allowContentDrag,
            .swipeToDismiss,
            .noBottomPosition,
            .shadow()
          ],
          content: {}
        )
      }
    }
  }
}

enum ShowBottomSheet: CGFloat, CaseIterable {
    case hidden = 0, visible = 0.5
  }

【问题讨论】:

    标签: swift swiftui google-maps-sdk-ios gmsmapview


    【解决方案1】:

    如果有人感兴趣,我想出了如何去做。该解决方案比我预期的要简单,它实际上只是将填充参数包装在 UIView.animate 闭包中,然后在 updateUIViewController 方法中调用它:

    private func setMapPadding(mapView: GMSMapView) {
        UIView.animate(withDuration: 0.5, delay: 0.18, usingSpringWithDamping: 0.75, initialSpringVelocity: 0) {
          mapView.padding = UIEdgeInsets(top: 0, left: 0, bottom: bottomPadding, right: 0)
        }
      }
    
    func updateUIViewController(_ uiViewController: MapViewController, context: Context) {
        animateCameraToNewGeoFactMarker(mapView: uiViewController.mapView)
      }
    
    

    【讨论】:

      猜你喜欢
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多