问题标签 [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.
ios - SwiftUI - 如何使水平滚动视图 RTL 友好?
我有一个支持 LTR 和 RTL 语言的 SwiftUI 应用程序。它不拘泥于其中任何一个,它只取决于用户想要什么。
我在一个可垂直滚动的事物列表中有一个可水平滚动的事物列表,之前是通过UICollectionView
在 a UITableViewCell
inside a中实现的UITableView
。
对于 RTL,水平滚动行需要默认位于最右边的第一个元素上(显然与 LTR 相对)。我还没有找到实现这一点的方法。
我试过flipsForRightToLeftLayoutDirection(_:)
了,但问题是它翻转了一切,包括Text()
滚动视图的内部。所以阿拉伯语文本看起来是镜像的。
这是我的观点骨架-
关于如何实现这一目标的任何想法?提前致谢。
ios - SwiftUI:无限、惰性、可滚动的视图,可在外观上显示任意单元格
感谢您帮助我解决以下问题。
总体目标
我在一个 SwiftUI 视图上工作,它包含一个可滚动的区域来呈现一些数据。假设它应该显示一定范围内的自然数,例如 0 到 2,000,000。每个数字都显示在跨越一半屏幕的自定义数字视图中。可滚动区域包含按升序排列的数量视图。
约束如下:
- 数字视图是延迟加载的。
- 我们可以定义加载可滚动区域时首先显示的数字视图。
- 在某些时候,可滚动视图必须忘记超出范围的视图以释放内存。前两个约束强加:我们可以加载视图并显示第 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
功能,因此会加载更小的数字。
我认为我们可以使最后一种方法起作用:
- 禁用更新号码列表
- 滚动到实际视图
- 再次启用更新
但这会很复杂,我们必须滚动用户在更新之前看到的确切位置。
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
在用户垂直滚动屏幕时我还能做些什么来捕获触摸事件。
任何建议或帮助表示赞赏!
问候,
彼得
swift - SwiftUI HorizontalTextView 滚动到尾随仅在手动滚动后工作
我有一个水平滚动视图,当用户输入更多内容时,它会向前沿滚动。但是,一旦达到最大长度,就不会发生这种情况。在事件中放置断点.onChange
表明scrollTo
应该运行滚动代理。
当我滑动水平滚动条时,它会按预期滚动,并且当我输入新内容时,它的行为完全符合我的预期。该问题似乎与滚动视图的初始状态有关,但我无法准确追踪在何处以及如何解决此问题。
可下载的示例项目:https ://github.com/imattice/HorizontalScrollExample
理想的解决方案是,一旦视图被加载并且用户输入的文本溢出滚动视图,文本将转移到前沿以将最新的文本显示到视图中,而无需手动滚动视图。
generics - 如何避免在 SwiftUI 中的回调闭包中使用“AnyView”类型擦除?
我正在尝试基于List
和创建表视图ScrollView
,并使用共享的基本视图。我目前的尝试使用基于构建器的方法,但需要使用AnyView
类型擦除的闭包。
我的目标是避免使用AnyView
类型擦除,以提高性能、可伸缩性和设计。
到目前为止,我尝试使用泛型类型参数重新设计都失败了。
下面的简化(和工作)代码示例仅显示一String
列,但抓住了基本挑战。(实际上,这些是具有各种数据类型、专用格式化程序、修饰符等的多列表。)
没有完全提供解决方案的两个相关问题:
ios - SwiftUI 在键盘关闭时拖动 ScrollView 闪烁
当我在 SwiftUI 中开发允许用户拖动 ScrollView 以关闭键盘的功能时,我发现如果在键盘关闭时拖动 ScrollView,则 ScrollView 会闪烁。这将破坏该功能的体验。
这是视频和最小代码示例:
swift - SwiftUI 滚动视图具有需要允许点击的间隔项
我有一个问题困扰了我好几天,所以就在这里。
我在顶部有一个可水平滚动的“headerView”,在带有项目的滚动视图下方,可垂直滚动。
HeaderView 有最小和最大高度,假设 100 是最小值,200 是最大值。
当用户滚动底部scrollview时,首先header需要缩小高度(在max和min之间),然后scrollview才能滚动自己,但top需要满足headerView的底部——它不能滚动到header view上。为了让事情更容易理解,我有截图(首先你可以看到实际的屏幕,然后你可以看到第一个间隔项目(红色))。可以在附加的视频中看到预期的行为。
我唯一的问题是标题上的按钮不可点击,headerView 也不能左右滚动。
视频可以在这里找到:https ://streamable.com/6czr2q