【问题标题】:How to make UIPageViewController switch controllers automatically如何让 UIPageViewController 自动切换控制器
【发布时间】:2017-04-22 17:10:12
【问题描述】:

我正在关注 Duc Tran 关于 UIPageViewController 的精彩教程。我想知道如何在不让用户滑动的情况下使 UIPageViewController 中的控制器自动转换。这就是代码在没有委托和数据源的情况下的样子。

class AnimesPageVC: UIPageViewController {
override var navigationOrientation: UIPageViewControllerNavigationOrientation {return .horizontal}

weak var pageViewControllerDelegate: AnimePagesVCDelegate?

var timeInterval: Int?

var images: [UIImage]?


lazy var animes: [UIViewController] = {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    var animes = [UIViewController]()

    if let images = self.images {
        for image in images {
            let anime = storyboard.instantiateViewController(withIdentifier: "AnimeImage")

            animes.append(anime)
        }
    }
    self.pageViewControllerDelegate?.setUpPageController(numberOfPages: animes.count)

    return animes
}()

override func viewDidLoad() {
    super.viewDidLoad()

    delegate = self
    dataSource = self

    loadPage(atIndex: 0)
}

func loadPage(atIndex: Int) {
    let anime = animes[atIndex]
    var direction = UIPageViewControllerNavigationDirection.forward
    if let currentAnime = viewControllers?.first {
        if let currentIndex = animes.index(of: currentAnime) {
            if currentIndex > atIndex {
                direction = .reverse
            }
        }
    }

    configurePages(viewController: anime)

    setViewControllers([anime], direction: direction, animated: true, completion: nil)
}

func configurePages(viewController: UIViewController) {
    for (index, animeVC) in animes.enumerated() {
        if viewController === animeVC {
            if let anime = viewController as? AnimeVC {
                anime.image = self.images?[index]
                self.pageViewControllerDelegate?.turnPageController(to: index)
            }
        }
    }
  }
}

那么我怎么能得到这种行为。将不胜感激任何帮助。 :)

【问题讨论】:

    标签: ios swift3 uipageviewcontroller


    【解决方案1】:

    在视图中添加一个计时器确实加载并使用更新的索引调用相同的加载函数

    Timer.scheduledTimer(withTimeInterval: 0.3, repeats: true) { (_) in
            // call your function here
            self.loadPage(atIndex: index + 1)
            // you have to update your index also.
            self.index = self.index + 1
        }
    

    这将每 0.3 秒调用一次 loadPage 函数

    请记住,如果您只进入下一页,我的解决方案仅适用于一种方式,因为我自动添加它不会返回到之前的控制器,因为您已经执行了类似的操作

    index = index - 1
    

    【讨论】:

    • 谢谢哈立德,它工作。但是,它只在第一次工作。它从第一个控制器切换到第二个控制器,但不会切换到下一个控制器。它也停留在第二个控制器上,所以如果我尝试滑动到下一个或上一个控制器,它会返回到第二个控制器。
    • 因为你现在也必须更新你的索引,你的索引是 0,你加 1。你必须保持你的索引也更新,这样它才能工作。我正在编辑答案,以便您查看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多