SwiftUI popover на iPad перемещается на поворот устройства - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь заставить поповер работать на iPad с swiftUI. Всплывающее окно показывает хорошо, однако, когда я поворачиваю устройство, всплывающее окно идет повсюду и не привязывается к своему первоначальному месту. Кто-нибудь решение для этого?

import SwiftUI

struct PopOver: View {
    var body: some View {
        Text("Hello world")
    }
}

struct ContentView: View {
    @State private var showPopover: Bool = false

    var body: some View {
        Button(action: {
            self.showPopover = true
        }) {
            Text("Select")
        }
        .popover(
            isPresented: self.$showPopover
        ) {
            PopOver()
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().previewDevice(PreviewDevice(rawValue: "iPad Pro (10.5-inch)"))
    }
}

1 Ответ

0 голосов
/ 02 марта 2020

Обходной путь

  1. отключить всплывающее окно при повороте устройства
  2. снова показать всплывающее окно, если оно было показано до поворота

    import SwiftUI
    
    
    import SwiftUI
    import UIKit
    import Combine
    
    struct PopOver: View {
        var body: some View {
            Text("Hello world")
        }
    }
    
    class Model: ObservableObject {
        @Published var show = false
        var handle: AnyCancellable?
        init() {
            handle = NotificationCenter.Publisher(center: .default, name: UIDevice.orientationDidChangeNotification).sink { (_) in
                print("orientation")
                if self.show {
                    self.show = false
                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
                        self.show = true
                    }
                }
            }
        }
        deinit {
            handle?.cancel()
            handle = nil
        }
    }
    struct ContentView: View {
        @ObservedObject var popoverModel = Model()
        var body: some View {
            Button(action: {
                self.popoverModel.show.toggle()
            }) {
                Text("Select")
            }
            .popover(
                isPresented: self.$popoverModel.show
            ) {
                PopOver()
            }
        }
    }
    

    ПРЕДУПРЕЖДЕНИЕ!

    if self.show {
        self.show = false
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            self.show = true
        }
    }
    

очень fr agile, вам лучше найти другой способ показа popover не раньше, чем завершится поворотный переход.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...