gpt4 book ai didi

ios - 如何使用 SwiftUI 隐藏 home 指示器?

转载 作者:行者123 更新时间:2023-12-02 03:12:29 34 4
gpt4 key购买 nike

UIKit 中 SwiftUI 中 prefersHomeIndicatorAutoHidden 属性的等价物是什么?

最佳答案

由于我在默认 API 中也找不到这个,所以我自己在 UIHostingController 的子类中创建了它。

我想要什么:

var body: some View {
Text("I hide my home indicator")
.prefersHomeIndicatorAutoHidden(true)
}

由于 prefersHomeIndicatorAutoHidden 是 UIViewController 上的一个属性,我们可以在 UIHostingController 中覆盖它,但我们需要从我们设置的 View 中获取 prefersHomeIndicatorAutoHidden 设置 View 层次结构它到 UIHostingController 中的 rootView 上。

我们在 SwiftUI 中执行此操作的方式是 PreferenceKeys。网上有很多很好的解释。

所以我们需要一个 PreferenceKey 将值发送到 UIHostingController:

struct PrefersHomeIndicatorAutoHiddenPreferenceKey: PreferenceKey {
typealias Value = Bool

static var defaultValue: Value = false

static func reduce(value: inout Value, nextValue: () -> Value) {
value = nextValue() || value
}
}

extension View {
// Controls the application's preferred home indicator auto-hiding when this view is shown.
func prefersHomeIndicatorAutoHidden(_ value: Bool) -> some View {
preference(key: PrefersHomeIndicatorAutoHiddenPreferenceKey.self, value: value)
}
}

现在,如果我们在 View 上添加 .prefersHomeIndicatorAutoHidden(true) ,它会将 PrefersHomeIndicatorAutoHiddenPreferenceKey 发送到 View 层次结构中。为了在托管 Controller 中捕获这一点,我创建了一个子类来包装 rootView 以监听首选项更改,然后更新 UIViewController.prefersHomeIndicatorAutoHidden:

// Not sure if it's bad that I cast to AnyView but I don't know how to do this with generics
class PreferenceUIHostingController: UIHostingController<AnyView> {
init<V: View>(wrappedView: V) {
let box = Box()
super.init(rootView: AnyView(wrappedView
.onPreferenceChange(PrefersHomeIndicatorAutoHiddenPreferenceKey.self) {
box.value?._prefersHomeIndicatorAutoHidden = $0
}
))
box.value = self
}

@objc required dynamic init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

private class Box {
weak var value: PreferenceUIHostingController?
init() {}
}

// MARK: Prefers Home Indicator Auto Hidden

private var _prefersHomeIndicatorAutoHidden = false {
didSet { setNeedsUpdateOfHomeIndicatorAutoHidden() }
}
override var prefersHomeIndicatorAutoHidden: Bool {
_prefersHomeIndicatorAutoHidden
}
}

未公开 PreferenceKey 类型且在 git 上也有 preferredScreenEdgesDeferringSystemGestures 的完整示例:https://gist.github.com/Amzd/01e1f69ecbc4c82c8586dcd292b1d30d

关于ios - 如何使用 SwiftUI 隐藏 home 指示器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56795572/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com