UIpageViewController 和定时器
UIpageViewController And Timer
我在屏幕顶部的一个 My UICollectionViewCell 中有一个 UIPageViewController(高度 = frame。height/3)它包含许多图像
它运行良好,但我需要它每 3 秒自动滚动到下一张图片,我该怎么办?
import UIKit
class PageViewController: UIPageViewController , UIPageViewControllerDataSource{
var scrollingTimer = Timer()
let imageNames = ["Apple_Watch_Main" , "Pic2" , "Pic3"]
override func viewDidLoad() {
super.viewDidLoad()
dataSource = self
let frameViewController = FrameViewController()
frameViewController.imageName = imageNames.first
let viewControllers = [frameViewController]
setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil)
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
let currentImageName = (viewController as! FrameViewController).imageName
let currentIndex = imageNames.index(of: currentImageName!)
if currentIndex! > 0 {
let frameViewController = FrameViewController()
frameViewController.imageName = imageNames[currentIndex! - 1]
return frameViewController
}
return nil
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
let currentImageName = (viewController as! FrameViewController).imageName
let currentIndex = imageNames.index(of: currentImageName!)
if currentIndex! < imageNames.count - 1 {
let frameViewController = FrameViewController()
frameViewController.imageName = imageNames[currentIndex! + 1]
return frameViewController
}
return nil
}
}
我在这里添加了我的手机
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
switch indexPath.item {
case 0 :
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as!ImageCell
let pagecontroller = PageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
self.addChildViewController(pagecontroller)
cell.addSubview(pagecontroller.view)
pagecontroller.view.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height/3)
return cell
case 1 :
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "filterandorganize", for: indexPath) as! FilterAndOrganize
return cell
case 2 :
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Offers", for: indexPath) as! Offers
return cell
case 3 :
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "OfferedProducts", for: indexPath) as! OfferedProducts
cell.firstViewController = self
return cell
default:
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Offers", for: indexPath) as! Offers
return cell
}
}
万一0
我搜索了很多,发现了一些类似的问题,但没有任何完整和正确的答案
这是我找到的答案,但它仍然有一个错误,那就是当用户自行滑动时,自动滚动并不完美,可能会从一张图片跳转到另一张图片
class PageViewController: UIPageViewController , UIPageViewControllerDataSource{
var index = 0
let imageNames = ["Apple_Watch_Main" , "Pic2" , "Pic3"]
override func viewDidLoad() {
super.viewDidLoad()
dataSource = self
let frameViewController = FrameViewController()
frameViewController.imageName = imageNames[index]
index += 1
let viewControllers = [frameViewController]
setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil)
Timer.scheduledTimer(timeInterval: 6.0 ,
target: self,
selector: #selector(myFunc(_:)),
userInfo: index,
repeats: true)
}
//FIXME: needs some fixes
func myFunc(_ timer: Timer) {
if index == imageNames.count {
index = 0
}
else {
self.changePIC(index)
index += 1
}
}
func changePIC(_ i: Int) {
let frameViewController = FrameViewController()
frameViewController.imageName = imageNames[i]
let viewControllers = [frameViewController]
setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil)
}
首先用 timeInterval
和选项 repeats
seat 设置一个计时器。
示例:
Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(scrollToNextItem), userInfo: nil, repeats: true
)
现在你有 Timer
每 3 秒触发一次 scrollToNextItem
方法。
现在阅读 setViewControllers(_:direction:animated:completion:)
了解如何设置要显示的视图控制器。
然后用所需的逻辑实现 scrollToNextItem
方法。
我在屏幕顶部的一个 My UICollectionViewCell 中有一个 UIPageViewController(高度 = frame。height/3)它包含许多图像 它运行良好,但我需要它每 3 秒自动滚动到下一张图片,我该怎么办?
import UIKit
class PageViewController: UIPageViewController , UIPageViewControllerDataSource{
var scrollingTimer = Timer()
let imageNames = ["Apple_Watch_Main" , "Pic2" , "Pic3"]
override func viewDidLoad() {
super.viewDidLoad()
dataSource = self
let frameViewController = FrameViewController()
frameViewController.imageName = imageNames.first
let viewControllers = [frameViewController]
setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil)
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
let currentImageName = (viewController as! FrameViewController).imageName
let currentIndex = imageNames.index(of: currentImageName!)
if currentIndex! > 0 {
let frameViewController = FrameViewController()
frameViewController.imageName = imageNames[currentIndex! - 1]
return frameViewController
}
return nil
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
let currentImageName = (viewController as! FrameViewController).imageName
let currentIndex = imageNames.index(of: currentImageName!)
if currentIndex! < imageNames.count - 1 {
let frameViewController = FrameViewController()
frameViewController.imageName = imageNames[currentIndex! + 1]
return frameViewController
}
return nil
}
}
我在这里添加了我的手机
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
switch indexPath.item {
case 0 :
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as!ImageCell
let pagecontroller = PageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
self.addChildViewController(pagecontroller)
cell.addSubview(pagecontroller.view)
pagecontroller.view.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height/3)
return cell
case 1 :
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "filterandorganize", for: indexPath) as! FilterAndOrganize
return cell
case 2 :
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Offers", for: indexPath) as! Offers
return cell
case 3 :
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "OfferedProducts", for: indexPath) as! OfferedProducts
cell.firstViewController = self
return cell
default:
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Offers", for: indexPath) as! Offers
return cell
}
}
万一0
我搜索了很多,发现了一些类似的问题,但没有任何完整和正确的答案
这是我找到的答案,但它仍然有一个错误,那就是当用户自行滑动时,自动滚动并不完美,可能会从一张图片跳转到另一张图片
class PageViewController: UIPageViewController , UIPageViewControllerDataSource{
var index = 0
let imageNames = ["Apple_Watch_Main" , "Pic2" , "Pic3"]
override func viewDidLoad() {
super.viewDidLoad()
dataSource = self
let frameViewController = FrameViewController()
frameViewController.imageName = imageNames[index]
index += 1
let viewControllers = [frameViewController]
setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil)
Timer.scheduledTimer(timeInterval: 6.0 ,
target: self,
selector: #selector(myFunc(_:)),
userInfo: index,
repeats: true)
}
//FIXME: needs some fixes
func myFunc(_ timer: Timer) {
if index == imageNames.count {
index = 0
}
else {
self.changePIC(index)
index += 1
}
}
func changePIC(_ i: Int) {
let frameViewController = FrameViewController()
frameViewController.imageName = imageNames[i]
let viewControllers = [frameViewController]
setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil)
}
首先用 timeInterval
和选项 repeats
seat 设置一个计时器。
示例:
Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(scrollToNextItem), userInfo: nil, repeats: true
)
现在你有 Timer
每 3 秒触发一次 scrollToNextItem
方法。
现在阅读 setViewControllers(_:direction:animated:completion:)
了解如何设置要显示的视图控制器。
然后用所需的逻辑实现 scrollToNextItem
方法。