【问题标题】:How to properly present a popup view in SwiftUI (not as a sheet)?如何在 SwiftUI 中正确呈现弹出视图(而不是作为工作表)?
【发布时间】:2021-01-27 11:08:28
【问题描述】:

我想在我的 iOS 应用中显示一个弹出式滑块。我目前正在使用这样的叠加层:

.overlay(
    HStack {
        if isEditingValue {
            Slider(value: $valueToEdit)
                .offset(y: 90)
        }
    }
)

问题是.overlay 视图之后的任何内容都将绘制在滑块顶部,该滑块已用.offset 向下移动,以免掩盖要编辑的值。

如何让弹出滑块显示在所有其他内容之上,并与它将编辑的视图正确相关?当弹出滑块可见时,我目前将所有内容隐藏在要编辑的值下方,这不是最佳选择。

【问题讨论】:

  • 检查这可能有用:stackoverflow.com/q/65883129/14733292
  • @Raja Kishan:这很有用,但它不能解决显示弹出窗口的问题,以便在视觉上附加到特定视图。换句话说,我不希望弹出窗口总是出现在屏幕的中心,而是直接出现在要编辑的值的视图下方。

标签: swift swiftui


【解决方案1】:

在一个视图层次结构中,这可以通过zIndex 解决,例如

TargetView()
.overlay(
    HStack {
        if isEditingValue {
            Slider(value: $valueToEdit)
                .offset(y: 90)
        }
    }
)
.zIndex(1) // default is 0, so others will be below
//.zIndex(isEditingValue ? 1 : 0)    // as variant

// ... other sibling views

如果视图层次结构复杂,则带有滑块的视图可能会与来自不同视图层次结构的视图重叠,这种情况仅靠布局修饰符无法解决,需要在应用 UI 设计的全局级别解决。

【讨论】:

  • 确切的问题是视图将被来自不同视图层次结构的视图重叠:例如兄弟。我想我需要将弹出窗口附加到的视图的视图几何传递到父视图,这可以将弹出窗口定位在其他所有内容上。有什么例子或建议吗?
  • 不,SwiftUI 渲染引擎不允许这样做,至少现在是这样。我需要重新索引所有受影响的子层次结构,例如stackoverflow.com/a/61847909/12299030stackoverflow.com/a/64283907/12299030stackoverflow.com/a/59798786/12299030。此外,作为变体,对于具有此类叠加层的视图,重新考虑将 UI 视为平面,或更改构造顺序,以便具有叠加层的视图位于顶部。
  • PreferenceKey 怎么样?
  • PreferenceKey 仅将信息/模型从孩子传递给父母,它不影响布局。如果您想分离滑块表单支架,那么将首选项覆盖粘贴在子子子项的正确位置可能会有所帮助,但是您将使用整个屏幕布局的这种硬耦合,并且您的组件将无法重用。当然,这取决于你。
  • 我了解 PreferenceKey 不会影响布局。我正在考虑存储弹出滑块用户视图的几何信息,以便可以将弹出窗口添加到根父 ZStack 并使用传递的几何图形定位。我正在考虑一个键锚点字典来查找弹出窗口的位置。如果它位于根 ZStack 中,则可以将其放置在所有其他位置之上。如果可以在不重新触发视图布局的情况下存储关键锚点,则视图可能会有一个引用类型属性。
猜你喜欢
  • 1970-01-01
  • 2022-10-06
  • 2020-05-23
  • 1970-01-01
  • 2020-12-19
  • 2021-04-10
  • 2021-02-08
  • 2022-12-12
  • 2022-01-01
相关资源
最近更新 更多