uipageviewcontroller - 正确解决新的快速点击动画模式/避免Apple新UIPageControl的半页错误
问题描述
打开你的 iPhone 14+ 并在主屏幕上有五个或更多页面。看看 UIPageControl
点击右侧。视图一次动画一页。
按住手指并在五个点之间晃动。它在五个屏幕之间切换。
现在将它放在点 0 上,然后点击右侧 - 但非常快速地点击五次,即使用动画进行赛道。请注意,我相信它有 3 种不同的动画模式,最终(如果你走得非常快,在内部动画中)以一种轻快的速度赶上你的点击。
关于(1)这就是我们多年来的编程方式
@IBAction func userDidChangePageControl(_ sender: UIPageControl) {
pageViewController.setViewControllers(
[pageViewController.pages[newIndex]],
direction: (pageViewController.currentIndex < newIndex) ? .forward : .reverse,
animated: true, completion: nil)
}
关于(2)现在每个人都必须这样做
@IBAction func userDidChangePageControl(_ sender: UIPageControl) {
let newIndex = sender.currentPage
var animationIsNeeded: Bool = true
if #available(iOS 14.0, *) {
switch sender.interactionState {
case .none:
// WTF??
break
case .continuous:
animationIsNeeded = false
case .discrete:
animationIsNeeded = true
@unknown default:
break
}
} else {
// prior to iOS14
animationIsNeeded = true
}
pageViewController.setViewControllers(
[pageViewController.pages[newIndex]],
direction: (pageViewController.currentIndex < newIndex) ? .forward : .reverse,
animated: animationIsNeeded, completion: {})
}
然而这是完全错误的。用手指模式 (3) 试试看会发生什么。
我用这个平庸的解决方案,
var animating: Bool = false
@IBAction func userDidChangePageControl(_ sender: UIPageControl) {
let newIndex = sender.currentPage
var animationIsNeeded: Bool = true
if #available(iOS 14.0, *) {
switch sender.interactionState {
case .none:
// WTF??
break
case .continuous:
animationIsNeeded = false
case .discrete:
animationIsNeeded = true
@unknown default:
break
}
} else { animationIsNeeded = true } // ancient phones
if animating { animationIsNeeded = false }
if animationIsNeeded { animating = true }
pageViewController.setViewControllers(
[pageViewController.pages[newIndex]],
direction: (pageViewController.currentIndex < newIndex) ? .forward : .reverse,
animated: animationIsNeeded, completion: { [weak self] _ in
guard let self = self else { return }
self.animating = false
})
}
这至少避免了错误,但与 Apple 解决方案完全不同。
有谁知道如何实现标准(见 iPhone 的主屏幕)Apple 解决方案?
(此外,我可能缺少一些重要的东西,这些天有没有更直接的方法将 UIPageControl 绑定到页面视图控制器,它确实固有地处理“新 Apple 方法 1,2,3”?)
放入一个糟糕的解决方案让我感到恶心,这不是指法模式“3”的现在正确行为。
解决方案
推荐阅读
- .net - 在 .NET 中,您可以设置对象的 GC 生成,或者以其他方式指示它即将超出范围吗?
- c# - Razor 页面模型绑定错误上的 SelectList
- python - 我想挑选一列 DataFrame 但结果自动按值排序
- scala - Scala 是否保证存在隐含时的连贯性?
- sql - 如何通过 select 语句中的 id 从另一个表中选择?
- java - SpringBoot oracle.jdbc.OracleDatabaseException:ORA-00932:不一致的数据类型:预期的 DATE 得到了 NUMBER
- python - 如果用户不输入任何内容,则尝试使函数循环并中断
- lua - 卢阿!没想到
- javascript - 尝试在 .Net Core Razor 页面中使用 babel 生成的代码
- visual-studio - 在自定义 MSBuild 任务中更改参考没有预期效果