SwiftUI: исходное положение элемента списка неверно

Я новичок в Swift, и у меня есть вопрос относительно представления списка.

Приведенный ниже код создает список изображения в виде кнопки, за которой следует текст.

Проблема в том, что элементы List изначально немного левее, но при первом обновлении они перемещаются вправо на место.

import SwiftUI

struct TodoItem {
    var name: String
    var completed: Bool

    init(_ name: String) {
        self.name = name
        self.completed = false
    }
}

struct ContentView: View {

    @State var todos: [TodoItem] = [
        TodoItem("This"),
        TodoItem("Is"),
        TodoItem("Some"),
        TodoItem("Todo"),
        TodoItem("Task")
    ]

    var body: some View {
        NavigationView {
            List(todos.indices) { index in
                HStack {
                    Image(systemName: self.todos[index].completed ? "checkmark.circle" : "circle")
                        .imageScale(.large)
                        .onTapGesture {
                            self.todos[index].completed.toggle()
                        }

                    Text(self.todos[index].name)
                    Spacer()
                }
            }
            .navigationBarTitle("Todos")
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

person Pascal K    schedule 04.02.2020    source источник


Ответы (1)


Вот фиксированный корпус (протестирован и работает с Xcode 11.3.1)

var body: some View {
    NavigationView {
        List {
            ForEach (todos.indices) { index in
                HStack {
                    Image(systemName: self.todos[index].completed ? "checkmark.circle" : "circle")
                        .imageScale(.large)
                        .onTapGesture {
                            self.todos[index].completed.toggle()
                        }

                    Text(self.todos[index].name)
                    Spacer()
                }
            }.listRowInsets(EdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 20))
        }
        .navigationBarTitle("Todos")
    }
}
person Asperi    schedule 04.02.2020
comment
Большое спасибо! - person Pascal K; 04.02.2020
comment
Что именно вы изменили и почему это работает сейчас? - person Qbyte; 05.02.2020