SwiftUI - contextMenu в ячейке LazyVGrid, вызывающей сбой анимации при наличии карты

У меня есть LazyVGrid и кнопка NavigationBarItem, которая меняет количество столбцов. Он циклически проходит через 1, 2, 3, затем возвращается к 1 и т. Д. Я использую.animation(.default)модификатор, чтобы оживить это изменение. Когда есть только один столбец, я использую другую структуру ячеек, которая включает небольшой элемент Map. У меня есть contextMenu, которое отлично работает для 2 и 3 столбцов, но сразу вылетает при использовании в ячейке с одним столбцом.

AnimationError[2652:855376] [Неизвестное имя процесса] CGImageCreate: недопустимое изображение alphaInfo: kCGImageAlphaNone. Это должно быть kCGImageAlphaNoneSkipLast

Этот сбой происходит только на моем реальном устройстве iPhone 11 Pro, симуляторы справляются с этим нормально. Если убрать анимацию, все хорошо.

Компилируемая, урезанная версия:

import SwiftUI
import CoreLocation
import MapKit

struct HillMO: Identifiable {
    let id = UUID()
    let name: String
    let latitude: Double
    let longitude: Double
}

struct ContentView: View {
    
    @State private var gridLayout: [GridItem] = [GridItem(), GridItem(), GridItem()]
    
    var body: some View {
        NavigationView {
            VStack {
                GeometryReader { geometry in
                    ScrollView {
                        LazyVGrid(columns: gridLayout, alignment: .center, spacing: 8) {
                            ForEach(hills) { hill in
                                Cell(hill: hill, width: geometry.size.width, columns: gridLayout.count)
                                    .contextMenu {
                                        Button(action: { }) { Label("Bingo", image: "eyeglasses") }
                                        Button(action: { }) { Label("Bungo", image: "hourglass") }
                                    }
                            }
                        }.padding(5)
                        .animation(.default)
                    }
                }
            }
            .navigationBarTitle("Bagger")
            .navigationBarItems(
                trailing: HStack {
                    Button(action: {
                        gridLayout = Array(repeating: .init(.flexible()), count: gridLayout.count % 3 + 1)
                    }) {
                        Image(systemName: "circle.grid.3x3")
                    }
                }
            )
        }
    }
    
    let hills = [ HillMO(name: "un", latitude: 0.0, longitude: 0.0),
                  HillMO(name: "dau", latitude: 1.0, longitude: 1.0),
                  HillMO(name: "tri", latitude: 2.0, longitude: 2.0),
                  HillMO(name: "pedwar", latitude: 3.0, longitude: 3.0),
                  HillMO(name: "pump", latitude: 4.0, longitude: 4.0),
                  HillMO(name: "chwech", latitude: 5.0, longitude: 5.0)
                ]
}

Мои представления Cell и CellMap:

struct Cell: View {
    
    var hill: HillMO
    var width: CGFloat
    var columns: Int
    
    var body: some View {
        Group {
            if columns != 1 {
                ZStack {
                    Rectangle()
                    Text(hill.name).foregroundColor(.white)
                }
            } else {
                ZStack {
                    Rectangle()
                    HStack {
                        Text(hill.name).foregroundColor(.white)
                        Spacer()
                        CellMap(coordinateRegion: MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: hill.latitude, longitude: hill.longitude),
                                                                     latitudinalMeters: 300000,
                                                                     longitudinalMeters: 300000))
                            .frame(width: (width / CGFloat(columns)) * 0.24, height: (width / CGFloat(columns)) * 0.24)
                            .clipShape(Circle())
                    }
                }
            }
        }
        .frame(height: (width / CGFloat(columns)) * (columns == 1 ? 0.25 : 1.25))
    }
}

struct CellMap: View {
    
    @State var coordinateRegion: MKCoordinateRegion
    
    var body: some View {
        Map(coordinateRegion: $coordinateRegion)
    }
}

1 ответ

Решение

Постарайтесь ограничить свою анимацию только точным, вашим, государственным значением

}.padding(5)
.animation(.default, value: gridLayout)

и для этого потребуется сделать HillMO равноправный

struct HillMO: Identifiable, Equatable {
    static func == (lhs: Self, rhs: Self) -> Bool {
        lhs.id == rhs.id
    }

    let id = UUID()
    let name: String
    let latitude: Double
    let longitude: Double
}
Другие вопросы по тегам