首页 > 解决方案 > 正确解决新的快速点击动画模式/避免Apple新UIPageControl的半页错误

问题描述

打开你的 iPhone 14+ 并在主屏幕上有五个或更多页面。看看 UIPageControl

  1. 点击右侧。视图一次动画一页。

  2. 按住手指并在五个点之间晃动。它在五个屏幕之间切换。

  3. 现在将它放在点 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”的现在正确行为。

标签: uipageviewcontrollerios14uipagecontrol

解决方案


推荐阅读