SwiftUI - как избежать отступа строки в списке, когда в режиме редактирования, но не с помощью onDelete? (код / ​​видео прилагается) - PullRequest
3 голосов
/ 18 апреля 2020

В SwiftUI, как избежать отступа содержимого строки в моем Списке, когда я перехожу в режим редактирования, но не использую onDelete? То есть, в настоящее время содержимое моей строки имеет отступ, как это происходит, как будто кнопка «удалить» будет показана слева, однако я не использую onDelete, поэтому там нет кнопки.

Анимированный GIF

enter image description here

Извлечение кода здесь:

var body: some View {
    VStack{
        List() {
            ForEach(gcTasks) { gcTask in
                HStack {
                    GCTaskRow(withGcTask: gcTask, haha: "")
                }
            }
            // .onDelete(perform: self.deleteTask)   // NOTE: HAVE REMOVED
            .onMove(perform: self.move)
        }
    }
    .environment(\.editMode, listInEditMode ? .constant(.active) : .constant(.inactive))
}

Фон - На самом деле хотите перейти к тому, чтобы быть всегда в режиме РЕДАКТИРОВАНИЯ, т. е. всегда есть возможность перетаскивания строки вверх / вниз, однако никогда не будет использовать Delete, поэтому вы хотите просмотреть все следы onDelete, в данном случае это автоматический c отступ.

ОБНОВЛЕНИЕ: Другой пример (игровые площадки) того, как происходит нежелательное отступление:

import SwiftUI
import PlaygroundSupport

let modelData: [String] = ["Eggs", "Milk", "Bread"]

struct ListTestNoDelete: View {
    private func move(from uiStartIndexSet: IndexSet, to uiDestIndex: Int) {
        print("On Move")
    }
    var body: some View {
        NavigationView {
            VStack {
                List {
                    ForEach(modelData, id: \.self) { str in
                        Text(str)
                    }
                    .onMove(perform: self.move)
                }
                .environment(\.editMode, .constant(.active))
                .navigationBarTitle( Text("Test") )
            }
        }
    }
}


let listTest = ListTestNoDelete()
PlaygroundPage.current.liveView = UIHostingController(rootView: listTest)

enter image description here

Ответы [ 2 ]

4 голосов
/ 18 апреля 2020

Возможно, стоит отправить запрос в Apple, но это поведение по умолчанию. На данный момент возможен следующий обходной путь. Протестировано с Xcode 11.4 / iOS 13.4.

demo

struct DemoListEditMode: View {

    @State var items = ["a","b","c","d","e"]

    var body: some View {
        List {
            ForEach(items, id: \.self) { z in
                HStack {
                    Image(systemName: "checkmark.square") // just for demo
                    Text("\(z)")
                }
            }.onMove(perform: self.move)
            .listRowInsets(EdgeInsets(top: 0, leading: -24, // workaround !!
                bottom: 0, trailing: 0))                    
        }
        .environment(\.editMode, .constant(.active)) // persistent edit mode
    }

    func move(source: IndexSet, destination: Int) {
        self.items.move(fromOffsets: source, toOffset: destination)
    }
}
1 голос
/ 30 апреля 2020

Возможно, это не очень элегантное исправление, но вы можете расширить список влево.

List {
    // ...
}
// .padding(.leading, self.isEditing == .inactive ? 0 : -39)
.padding(.leading, self.isEditing ? -45 : 0)
...