SwiftUI: проблема разбивки на страницы в списке - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь создать разбиение на страницы в SwiftUI с помощью списка, но он работает некорректно при прокрутке и изменяется его размер.

Вот код, который я использую для этого.

class ViewModel: ObservableObject {
    @Published var feeds:[String] = []

    init() {
        for i in 0..<10{
            feeds.append("Page \(i)")
        }
    }

    func appentNewData() -> Void{
        for i in self.feeds.count..<(self.feeds.count + 10){
            feeds.append("New Page \(i)")
        }
    }
}

struct ContentView: View {

@ObservedObject var viewModel = ViewModel()

@State var isExpanded:Bool = false

var body: some View {
    VStack(spacing:0){
        Button(action: {
            withAnimation {
                self.isExpanded.toggle()
            }
        }) {
            Text("Search Bar ( Tap to expand )")
                .font(.title)
                .foregroundColor(Color.black)
            
        }
        .frame(height: self.isExpanded ? 200 : 100)
        .frame(maxWidth:.infinity)
        .background(Color.red)
        
        GeometryReader { (proxy) in
            List{
                ForEach(self.viewModel.feeds, id:\.self) { feed in
                    FeedView(text: feed, size: proxy.size)
                        .listRowInsets(.init(top: 0, leading: 0, bottom: 0, trailing: 0))
                        .frame(width:proxy.size.width, height: proxy.size.height)
                        .border(Color.green ,width: 5.0)
                        .onAppear {
                            guard let lastItem = self.viewModel.feeds.last else{
                                return
                            }
                            if lastItem == feed{
                                self.viewModel.appentNewData()
                            }
                        }
                }
            }
            .frame(width:proxy.size.width, height: proxy.size.height)
            .background(Color.purple)
            .onAppear {
                UITableViewCell.appearance().selectionStyle = .none
                UITableView.appearance().separatorStyle = .none
                UITableView.appearance().isPagingEnabled = true
                UITableView.appearance().separatorStyle = .none
                UITableView.appearance().showsVerticalScrollIndicator = false
            }.onDisappear {
                UITableView.appearance().isPagingEnabled = false
                UITableView.appearance().showsVerticalScrollIndicator = true
            }
        }
    }.clipped()
}
}

struct FeedView:View {
@State var text:String
var size:CGSize
var body: some View{
    VStack(spacing: 20.0){
        Text(text)
            .font(.largeTitle)
        HStack{
            Text("Width : \(size.width)")
                .font(.headline)
            Text("Height : \(size.height)")
                .font(.headline)
        }
    }
    .frame(maxWidth:.infinity,maxHeight: .infinity,alignment: .center) 
}
}

Он ведет себя вот так.

enter image description here

Not sure why it is not dividing the row equally since each row has the same width and height.

Here is the быстрый проект , если кто-то хочет попробовать.

...