現在要邁入第三個頁面
第三個頁面是過去訂單
裡面是可以左右滑動
應該是使用UISegmentedControl
與UIPageViewController
裡面塞入兩個ViewController
來看看原生的Uber eat
效果
UISegmentedControl
就是APP中很常使用的
一排式的按鈕
自動可以做到左右滑軌效果
選中哪個Button
就會有特效滑動過去
那我們就先來新增UISegmentedControl
var segmentedControl = UISegmentedControl()
segmentedControl
設置items
也就是上面的Button
數量
新增越多segmentedControl
上得按鈕越多
override func viewDidLoad() {
super.viewDidLoad()
segmentedControl = UISegmentedControl(items: ["過去的訂單","即將推出"])
segmentedControl.backgroundColor = UIColor.lightGray
segmentedControl.frame = CGRect.init(x: 0, y: 44, width: self.view.frame.width, height: 30)
segmentedControl.addTarget(self, action: #selector(segmentedChange), for: .valueChanged)
self.view.addSubview(segmentedControl)
}
點擊事件要新增segmentedChange
可以看selectedSegmentIndex
點擊的index
或是Button
的文字titleForSegment
@objc func segmentedChange(sender: UISegmentedControl) {
// index
print(sender.selectedSegmentIndex)
// 文字
print(sender.titleForSegment(at: sender.selectedSegmentIndex)!)
}
Demo
UIPageViewController
就是下面兩個滑動的View
有手勢
可以左右滑動
切換View
也可以連動UISegmentedControl
做控制互相配合
到正確的index
viewControllerArr
負責儲存你所有的controller
selectedIndex
負責儲存現在點擊或切換的index
var pageViewControl = UIPageViewController()
var viewControllerArr = Array<UIViewController>()
var selectedIndex: Int = 0
新增到addChild
以及addSubview
pageViewControl = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
pageViewControl.view.frame = CGRect.init(x: 0, y: 74, width: self.view.frame.width, height: self.view.frame.height - 74)
pageViewControl.delegate = self
pageViewControl.dataSource = self
pageViewControl.isEditing = true
self.addChild(pageViewControl)
self.view.addSubview(pageViewControl.view)
UIViewController
新增兩個簡單的
只是View
的顏色做區別
新增到陣列裡面
然後 setViewControllers
一個首頁
let viewController1 = UIViewController()
viewController1.view.backgroundColor = UIColor.init(red: 1, green: 0.2, blue: 0.4, alpha: 0.3)
viewController1.view.tag = 0
let viewController2 = UIViewController()
viewController2.view.backgroundColor = UIColor.init(red: 0.4, green: 0.3, blue: 1, alpha: 0.3)
viewController2.view.tag = 1
viewControllerArr.append(viewController1)
viewControllerArr.append(viewController2)
pageViewControl.setViewControllers([viewControllerArr[0]], direction: .forward, animated: false)
他的func
裡面
viewControllerBefore
從左往右滑viewControllerAfter
從右往左滑裡面要設置不要超出你的Array
的一些防呆
以及紀錄你滑動後的index
並且也要使用selectedSegmentIndex
來連動segmentedControl
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
selectedIndex = viewController.view.tag
segmentedControl.selectedSegmentIndex = selectedIndex
let pageIndex = viewController.view.tag - 1
if pageIndex < 0 {
return nil
}
return viewControllerArr[pageIndex]
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
selectedIndex = viewController.view.tag
segmentedControl.selectedSegmentIndex = selectedIndex
let pageIndex = viewController.view.tag + 1
if pageIndex > 1 {
return nil
}
return viewControllerArr[pageIndex]
}
segmentedChange
也要新增連動pageViewControl
使用setViewControllers
就可以了
@objc func segmentedChange(sender: UISegmentedControl) {
// index
print(sender.selectedSegmentIndex)
// 文字
print(sender.titleForSegment(at: sender.selectedSegmentIndex)!)
pageViewControl.setViewControllers([viewControllerArr[sender.selectedSegmentIndex]], direction: .forward, animated: false)
}
Demo
執行以後發現
好像動畫如果我沒做設定
得話
左右滑動是翻頁效果
並不是我們想要的效果
這邊要回去初始化設定為scroll
就會變成滑動效果
pageViewControl = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
Demo
完成 大概是這樣的效果