问题标签 [swiftui-scrollview]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
143 浏览

ios - SwiftUI - 如何使水平滚动视图 RTL 友好?

我有一个支持 LTR 和 RTL 语言的 SwiftUI 应用程序。它不拘泥于其中任何一个,它只取决于用户想要什么。

我在一个可垂直滚动的事物列表中有一个可水平滚动的事物列表,之前是通过UICollectionView在 a UITableViewCellinside a中实现的UITableView

对于 RTL,水平滚动行需要默认位于最右边的第一个元素上(显然与 LTR 相对)。我还没有找到实现这一点的方法。

我试过flipsForRightToLeftLayoutDirection(_:)了,但问题是它翻转了一切,包括Text()滚动视图的内部。所以阿拉伯语文本看起来是镜像的。

这是我的观点骨架-

关于如何实现这一目标的任何想法?提前致谢。

0 投票
1 回答
267 浏览

swiftui - swiftui ScrollViewReader scrollTo 不正确工作

我正在用 swiftui 开发一个应用程序。缩放后,当我说使用 ScrollViewReader 滚动到角落时,它会离开屏幕。我的代码如下。尝试几次后失败。它不是每次都这样做。

我的主屏幕。

在此处输入图像描述

滚动到之后

在此处输入图像描述

0 投票
0 回答
53 浏览

ios - SwiftUI:无限、惰性、可滚动的视图,可在外观上显示任意单元格

感谢您帮助我解决以下问题。

总体目标

我在一个 SwiftUI 视图上工作,它包含一个可滚动的区域来呈现一些数据。假设它应该显示一定范围内的自然数,例如 0 到 2,000,000。每个数字都显示在跨越一半屏幕的自定义数字视图中。可滚动区域包含按升序排列的数量视图。

约束如下:

  1. 数字视图是延迟加载的。
  2. 我们可以定义加载可滚动区域时首先显示的数字视图。
  3. 在某些时候,可滚动视图必须忘记超出范围的视图以释放内存。前两个约束强加:我们可以加载视图并显示第 1,000,000 个数字视图,而无需加载之前的 999,999 个数字视图。

第一约束

满足第一个约束很简单。我们创建一个ScrollView嵌套 a LazyVStack, aForEach以使数据可用和数字视图。如果我们显示我们的视图,打印语句只显示前几个视图被加载。

第二个约束

我们修改之前的代码。因此,我们将 嵌入ScrollView到 aScrollViewReader中并用 ID 标记数字视图。现在,一旦出现,我们就可以滚动到所需的数字视图ScrollView

但是现在我们违反了我们的第一个约束。当滚动到第 1000000 个数字视图时,我们必须初始化之前的 999,999 个。这有两个缺点:它需要大量的时间和内存。最终导致内存分配失败。也许,取消分配数字视图是一种选择。但是我们仍然必须初始化它们以便以后丢弃它们,这需要时间。

第三个约束

我不能 100% 确定 SwiftUI 是否或在什么情况下会在无法访问的情况下取消分配 number-view-structs。onDisappear我假设一旦调用了它们的方法,它们就可以从内存中删除。

替代解决方案

我读了一篇关于无限滚动列表的文章。这篇文章没有解决完全相同的问题。但它建议ForEach根据显示的数字视图修改迭代列表。onAppear我们可以使用和来跟踪显示的数字视图onDisappear。我们可以使用这两个函数来更新列表中加载的数字。

但是一旦我们更新列表,ScrollView 就会显示最小数字的数字视图,触发它的onAppear功能,因此会加载更小的数字。

我认为我们可以使最后一种方法起作用:

  1. 禁用更新号码列表
  2. 滚动到实际视图
  3. 再次启用更新

但这会很复杂,我们必须滚动用户在更新之前看到的确切位置。

0 投票
1 回答
47 浏览

ios - 当用户使用 Swift 在 iOS 上垂直滚动屏幕时,如何从 UIScrollView 捕获触摸事件?

我是 iOS 开发和 Swift 的新手,遇到以下问题:

我想从屏幕上捕捉触摸事件。我对常规视图执行此操作没有任何问题。不幸的是,我遇到了该UIScrollView组件的问题。当用户点击屏幕、长按屏幕或水平移动手指时,我可以捕捉触摸,但是当用户垂直移动手指并同时激活垂直滚动时,我无法捕捉到触摸捕捉倒数

我在 StackOverflow 上发现了一些关于类似问题的线程,但那里提供的解决方案并没有解决我的问题。

我的观点结构如下:

这是我的代码:

手势识别器被添加到顶层视图中。

我也有基本的自定义实现UIGestureRecognizer

我尝试做些什么来解决这个问题?

  • 设置参数scrollView.canCancelContentTouches = false- 没有帮助
  • 设置参数scrollView.isScrollEnabled = false- 我能够捕获所有触摸事件,但 scrollView 停止工作 - 没有帮助
  • 将手势识别器添加到 scrollView 并将其从顶级视图中删除 - 没有帮助
  • 将手势识别器添加到滚动视图和顶级视图 - 没有帮助
  • 设置参数scrollView.isUserInteractionEnabled = false- 我能够捕获所有触摸事件,但 scrollView 和所有 UI 组件停止工作 - 没有帮助
  • 重新排序MyRecognizer类中的调用:首先处理事件,然后从上层类调用方法super.touches...- 没有帮助

现在,我不知道UIScrollView在用户垂直滚动屏幕时我还能做些什么来捕获触摸事件。

任何建议或帮助表示赞赏!

问候,

彼得

0 投票
0 回答
22 浏览

swift - SwiftUI Horizo​​ntalTextView 滚动到尾随仅在手动滚动后工作

我有一个水平滚动视图,当用户输入更多内容时,它会向前沿滚动。但是,一旦达到最大长度,就不会发生这种情况。在事件中放置断点.onChange表明scrollTo应该运行滚动代理。

当我滑动水平滚动条时,它会按预期滚动,并且当我输入新内容时,它的行为完全符合我的预期。该问题似乎与滚动视图的初始状态有关,但我无法准确追踪在何处以及如何解决此问题。

可下载的示例项目:https ://github.com/imattice/Horizo​​ntalScrollExample

理想的解决方案是,一旦视图被加载并且用户输入的文本溢出滚动视图,文本将转移到前沿以将最新的文本显示到视图中,而无需手动滚动视图。

0 投票
1 回答
43 浏览

generics - 如何避免在 SwiftUI 中的回调闭包中使用“AnyView”类型擦除?

我正在尝试基于List和创建表视图ScrollView,并使用共享的基本视图。我目前的尝试使用基于构建器的方法,但需要使用AnyView类型擦除的闭包。

我的目标是避免使用AnyView类型擦除,以提高性能、可伸缩性和设计。

到目前为止,我尝试使用泛型类型参数重新设计都失败了。

下面的简化(和工作)代码示例仅显示一String列,但抓住了基本挑战。(实际上,这些是具有各种数据类型、专用格式化程序、修饰符等的多列表。)

没有完全提供解决方案的两个相关问题:

  • 65810765 - 如何创建一个带有输入的闭包结构参数,some View而不是AnyView在 SwiftUI 中返回?
  • 64655195 - 在将 SwiftUI 视图作为参数传递给函数时,如何避免将其转换为 AnyView?
0 投票
0 回答
30 浏览

ios - SwiftUI 在键盘关闭时拖动 ScrollView 闪烁

当我在 SwiftUI 中开发允许用户拖动 ScrollView 以关闭键盘的功能时,我发现如果在键盘关闭时拖动 ScrollView,则 ScrollView 会闪烁。这将破坏该功能的体验。

这是视频和最小代码示例:

视频

0 投票
1 回答
47 浏览

ios - SwiftUI:滚动视图中的引脚标题,在类似视图的 excel 中具有垂直和水平滚动

我使用多向滚动视图创建了一个类似 excel 的视图。现在我想固定标题,不仅是列标题,还有行标题。看下面的 gif:

在此处输入图像描述

我用来创建此视图的代码:

是否可以在此处固定列标题和行标题?

重要的是我只使用 VStack 和 HStack 而不是 LazyVStack 和 LazyHStack,因为我在滚动时需要平滑度,当我使用 Lazy 堆栈时,它会因为明显的原因而抖动很多。所以不能在这里真正使用节标题。

我还能遵循什么其他方法?

0 投票
0 回答
34 浏览

swift - SwiftUI 滚动视图具有需要允许点击的间隔项

我有一个问题困扰了我好几天,所以就在这里。

我在顶部有一个可水平滚动的“headerView”,在带有项目的滚动视图下方,可垂直滚动。

HeaderView 有最小和最大高度,假设 100 是最小值,200 是最大值。

当用户滚动底部scrollview时,首先header需要缩小高度(在max和min之间),然后scrollview才能滚动自己,但top需要满足headerView的底部——它不能滚动到header view上。为了让事情更容易理解,我有截图(首先你可以看到实际的屏幕,然后你可以看到第一个间隔项目(红色))。可以在附加的视频中看到预期的行为。

我唯一的问题是标题上的按钮不可点击,headerView 也不能左右滚动。

透明垫片

阻止点击的红色垫片

视频可以在这里找到:https ://streamable.com/6czr2q

0 投票
1 回答
32 浏览

xcode - 我如何使用 Swiftui 维护 Scrollview 子项高度

我是 swift 新手,我正在尝试将我的视图包装在 Scrollview 中。问题是,当我将内容包装在滚动视图中时,内容会缩小。我有下面的图片。 不带滚动视图的视图

使用滚动视图查看

示例代码:

我已尝试删除 GeometryReader,但仍然得到相同的结果,而且我似乎无法在线找到任何有用的解决方案。谢谢