Проблема с перетаскиванием карты и списка SwiftUIIOS

Программируем под IOS
Ответить
Anonymous
 Проблема с перетаскиванием карты и списка SwiftUI

Сообщение Anonymous »

Я пытаюсь создать разделенное представление с изменяемым размером в SwiftUI, где карта находится вверху, а список (который будет содержать местоположения позже) находится внизу, разделенный перетаскиваемым дескриптором. Пользователь должен иметь возможность перетаскивать маркер, чтобы плавно изменять размеры карты и списка. Текущая реализация функциональна, но непригодна для использования, поскольку анимация перетаскивания очень медленная и нервная. Кроме того, время от времени Xcode постоянно выводит на консоль следующую ошибку во время перетаскивания: Публикация изменений из обновлений представления не разрешена, это приведет к неопределенному поведению. Я считаю, что проблема вызвана циклом непрерывного рендеринга представления с изменением размера карты и списка, при этом карта, вероятно, пытается отобразить соответствующий регион с учетом изменения размера. Вот что у меня есть на данный момент:

Код: Выделить всё

import SwiftUI
import MapKit

struct DraggableSplitMapView: View {
@State private var mapRegion = MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: 37.7749, longitude: -122.4194),
span: MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)
)

@State private var mapHeight: CGFloat = 300
@GestureState private var dragOffset: CGSize = .zero

var body: some View {
NavigationView {
GeometryReader { geometry in
VStack(spacing: 0) {

Map(coordinateRegion: $mapRegion)
.frame(height: calculateMapHeight(geometry: geometry))

// Drag handle
ZStack {
Color.clear.frame(height: 12)
Capsule()
.fill(Color.secondary.opacity(0.5))
.frame(width: 40, height: 6)
}
.gesture(
DragGesture()
.updating($dragOffset) { value, state, _ in
state = value.translation
}
.onEnded { value in
let newHeight = self.mapHeight + value.translation.height
// Clamp the height from getting too big or small.
self.mapHeight = max(100, min(geometry.size.height - 150, newHeight))
}
)

// Dummy list
List(0.. CGFloat {
let proposedHeight = self.mapHeight + self.dragOffset.height
// Ensure the height stays within reasonable bounds during the drag.
return max(100, min(geometry.size.height - 150, proposedHeight))
}
}

struct DraggableSplitMapView_Previews: PreviewProvider {
static var previews: some View {
DraggableSplitMapView()
}
}
Карта будет содержать несколько сотен аннотаций, отображаемых позже, поэтому я думаю, что проблема будет только усугубляться, если данные будут привязаны к карте. Как я могу решить эту проблему и добиться плавного перетаскивания, продолжая использовать встроенное представление карты SwiftUI? Есть ли способ предотвратить обратную запись карты в привязку к региону во время жеста перетаскивания или лучший способ структурировать это представление, чтобы избежать конфликта? Любая помощь приветствуется.

Подробнее здесь: https://stackoverflow.com/questions/798 ... zing-issue
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»