용기 보기 controller를 사용하여 페이지 컨트롤을 보기의 일부분에 삽입합니다
완성된 인상은 이렇다.
작업 환경
이루어지다
모 뷰
먼저 부모의 관점에서 시작한다.
ViewController.swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let label = UILabel()
label.frame.size = CGSize(width: 200, height: 100)
label.center = view.center
label.text = "ベースのview"
label.textAlignment = .Center
view.addSubview(label)
// コンテナに追加
let pageVC = PageViewController(transitionStyle: .Scroll,
navigationOrientation: .Horizontal,
options: nil)
let pageViewHeight: CGFloat = 100
pageVC.view.frame = CGRect(x: 0, y: view.bounds.size.height - pageViewHeight, width: view.bounds.size.width, height: pageViewHeight)
addChildViewController(pageVC)
view.addSubview(pageVC.view)
pageVC.didMoveToParentViewController(self)
}
}
PageViewController
(후술)의 실례는 하위 보기의 보기 controller로 사용됩니다.addChildViewController(_:)
에서 아이의view controller로 상기 PageViewController
보기 컨트롤러 증가
didMoveToParentViewController(_:)
를 중지하기 위해 명확하게 호출하위 뷰
부모 보기에 삽입된 보기 controller를 만듭니다.
여러view를 포함하는 페이지 제어를 실현하기 때문에 계승
UIPageViewController
합니다.동시 응용UIPageViewControllerDataSource
,UIPageViewControllerDelegate
.PageViewController.swift
import UIKit
class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
var contentVCs = [UIViewController]()
var currentIndex: Int = 0
// MARK: - View lifecycle
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.blackColor()
dataSource = self
delegate = self
for i in 0..<3 {
let contentVC = PageContentViewController()
contentVC.contentNumber = i
contentVCs.append(contentVC)
}
setViewControllers([contentVCs[0]], direction: .Forward, animated: true, completion: nil)
}
// MARK: - UIPageViewControllerDataSource
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
guard let index = contentVCs.indexOf(viewController) where index != NSNotFound else { return nil }
if index < contentVCs.count - 1 {
return contentVCs[index + 1]
} else {
return contentVCs.first
}
}
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
guard let index = contentVCs.indexOf(viewController) where index != NSNotFound else { return nil }
if index > 0 {
return contentVCs[index - 1]
} else {
return contentVCs.last
}
}
func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
return contentVCs.count
}
func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
return currentIndex
}
// MARK: - UIPageViewControllerDelegate
func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
guard finished else { return }
guard let contentVC = pageViewController.viewControllers?.first else { return }
guard let index = contentVCs.indexOf(contentVC) where index != NSNotFound else { return }
currentIndex = index
}
}
viewDidLoad()
에서 3개의 페이지 제어 내용의view controller를 설정합니다.활용
setViewControllers(_:direction:animated:completion:)
pageViewController(_:viewControllerBeforeViewController:)
, pageViewController(_:viewControllerAfterViewController:)
에서 표시된 앞뒤의view controller를 지정합니다.presentationCountForPageViewController(_:)
에 호출 표시기 수량 설정presentationIndexForPageViewController(_:)
에 페이지 표시기의 인덱스(위치) 설정currentIndex
pageViewController(_:didFinishAnimating:previousViewControllers:transitionCompleted:)
에서 페이지의transtion이 끝날 때의 처리를 설명합니다업데이트
currentIndex
변수
contentNumber
를 생성할 때 변수를 수신하고 페이지 번호로 표시합니다.PageContentViewController.swift
class PageContentViewController: UIViewController {
var contentNumber: Int?
override func viewDidLoad() {
super.viewDidLoad()
guard let contentNumber = contentNumber else { return }
let label = UILabel(frame: CGRect(x: 0, y: 0, width: view.bounds.size.width, height: 100))
label.text = "\(contentNumber + 1)枚目"
label.textColor = UIColor.whiteColor()
label.textAlignment = .Center
view.addSubview(label)
}
}
끝맺다
이상의 설치를 완료했습니다.
좀 복잡하지만 yenta의 iOS 앱은 이런 느낌을 실현했다.
참고 자료
Reference
이 문제에 관하여(용기 보기 controller를 사용하여 페이지 컨트롤을 보기의 일부분에 삽입합니다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ysk_1031/items/0054f2f0ca1e9d54a632텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)