предпочитаемыйScreenEdgesDeferringSystemGestures в SwiftUI - PullRequest
1 голос
/ 15 апреля 2020

в UIKit есть возможность отключить «домашнее» свайпирование системы снизу вверх (не полностью отключить, но свайп игнорирует первый раз и заставит пользователя повторить его, если он действительно этого захочет). setNeedsUpdateOfScreenEdgesDeferringSystemGestures() на самом деле правильно делает то, что мне нужно.

Но как мне достичь того же в SwiftUI?

Я пытался вызвать этот метод в SceneDelegate так:

        let window = UIWindow(windowScene: windowScene)
        let uiKitView = UIHostingController(rootView: contentView)
        uiKitView.setNeedsUpdateOfScreenEdgesDeferringSystemGestures()
        window.rootViewController = uiKitView

, но это не работает, если вы не переопределите preferredScreenEdgesDeferringSystemGestures для возврата .all Я не могу переопределить это вычисленное свойство UIHostingController:

extension UIHostingController {
    open override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge{
        return [.all];
    }
}

Я получаю предупреждение:

Расширения классов generi c не могут содержать членов '@ obj c'

Кто-нибудь знает, как этого достичь?

1 Ответ

1 голос
/ 15 апреля 2020

Просто переопределите его в пользовательских контроллерах хостинга

class MyHostingController<Content: View>: UIHostingController<Content> {
    open override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge{
        return [.all];
    }
}

и используйте его как root контроллер

let window = UIWindow(windowScene: windowScene)

let controller = MyHostingController(rootView: contentView)
controller.setNeedsUpdateOfScreenEdgesDeferringSystemGestures()

window.rootViewController = controller
...