[Swift] UIPageViewController의 Tips 정리 (초급편)
소개
오랜만에 UIPageViewController를 사용할 기회가 있었기 때문에,
정리해 두고 싶습니다.
덧붙여서, UIPageViewController란,
페이지 넘기기나 종이를 넘기는 것 같은 애니메이션을 할 수 있는 ViewController입니다.
Tips
애니메이션 유형
UIPageViewControllerTransitionStyle
상수
설명
.Scroll
페이지 넘기기
.PageCurl
종이 넘기기
넘기는 방향
UIPageViewControllerNavigationOrientation
상수
설명
.Horizontal
가로
.Vertical
세로 방향
페이지를 보내는 방향
(1) 순방향
・가로 방향의 경우는 왼쪽으로 스와이프로 이동
· 세로 방향의 경우 위로 스 와이프로 이동
샘플 코드extension SDTPageViewController: UIPageViewControllerDataSource {
func pageViewController(pageViewController: UIPageViewController,
viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
return goFowardPage(viewController)
}
func pageViewController(pageViewController: UIPageViewController,
viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
return goBackPage(viewController)
}
private func goBackPage(viewController: UIViewController) -> UIViewController? {
var index = (viewController as! SDTPageInnerViewController).pageIndex
if index == 0 || index == NSNotFound {
return nil
}
index -= 1
return viewControllerAtIndex(index)
}
private func goFowardPage(viewController: UIViewController) -> UIViewController? {
var index = (viewController as! SDTPageInnerViewController).pageIndex
if index == NSNotFound {
return nil;
}
index += 1
if index == imageFiles.count {
return nil;
}
return self.viewControllerAtIndex(index)
}
private func viewControllerAtIndex(index:Int) -> SDTPageInnerViewController? {
if imageFiles.count == 0 || index >= imageFiles.count {
return nil
}
if let vc = UIStoryboard.getViewController("Main", identifier: "SDTPageInnerViewController") as? SDTPageInnerViewController {
vc.pageIndex = index
vc.filePath = imageFiles[index]
return vc
}
return nil
}
}
(2) 역방향
・횡방향의 경우는, 오른쪽으로 스와이프로 이동
・세로 방향의 경우는 아래로 스와이프로 이동
순방향으로 넘기는 패턴과 goFowardPage와 goBackPage를 반대로 하면 됩니다.
샘플extension SDTPageViewController: UIPageViewControllerDataSource {
func pageViewController(pageViewController: UIPageViewController,
viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
return goBackPage(viewController)
}
func pageViewController(pageViewController: UIPageViewController,
viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
return goFowardPage(viewController)
}
}
지정 페이지로 이동
슬라이더와 연동시키거나, 도중에서 읽는 등에 이용할 수 있습니다
샘플 코드 func scrollToPage(pageIndex: Int) {
if let currentViewController = viewControllerAtIndex(pageIndex) {
if let pageViewController = pageViewController {
pageViewController.setViewControllers([currentViewController],
direction: .Forward, animated: false, completion: nil)
}
}
}
페이지 번호 얻기
자신의 페이지 컨트롤러와 페이지 번호를 표시하는 데 사용할 수 있습니다.
샘플 코드extension SDTPageViewController: UIPageViewControllerDelegate {
func pageViewController(pageViewController: UIPageViewController,
didFinishAnimating finished: Bool,
previousViewControllers: [UIViewController],
transitionCompleted completed: Bool) {
if let vc = pageViewController.viewControllers?.first as? SDTPageInnerViewController {
//ページ番号を表示
print(vc.pageIndex)
}
}
}
옵션
추천은 페이지 사이에 여백을 지정할 수 있는 옵션입니다.
해당 페이지를 표시할 때 여백이 표시되지 않지만,
페이지를 넘기면 페이지 사이에 여백이 생깁니다.
상수
설명
UIPageViewControllerOptionInterPageSpacingKey
여백 지정
샘플 코드 pageViewController = UIPageViewController(transitionStyle: .Scroll,
navigationOrientation: .Horizontal,
options: [UIPageViewControllerOptionInterPageSpacingKey : 20])
참고 소스 코드
언제나 과거에 작성한 소스 코드를 복사하고 있으므로, 여기에 메모로 남겨 둡니다.
가로 스크롤로, 순방향으로 페이지가 넘기는 샘플입니다.
(덧붙여서, StoryBoard는 할애합니다. 양해 바랍니다.)
기초 ViewController
SDTPageViewController.swiftimport UIKit
class SDTPageViewController : UIViewController {
private var pageViewController:UIPageViewController!
private var imageFiles = ["image01.jpeg","image02.jpeg","image03.jpeg","image04.jpeg","image05.jpeg"]
private var pageIndex = 0
override func viewDidLoad() {
super.viewDidLoad()
setup()
}
private func setup() {
if let startingViewController = viewControllerAtIndex(0) {
pageViewController = UIPageViewController(transitionStyle: .Scroll,
navigationOrientation: .Horizontal,
options: [UIPageViewControllerOptionInterPageSpacingKey : 20])
if let pageViewController = pageViewController {
pageViewController.dataSource = self
pageViewController.delegate = self
pageViewController.setViewControllers([startingViewController],
direction: .Forward,
animated: false,
completion: {done in})
pageViewController.view.frame = self.view.frame
addChildViewController(pageViewController)
self.view.addSubview(pageViewController.view)
}
}
}
func scrollToPage(pageIndex: Int) {
if let currentViewController = viewControllerAtIndex(pageIndex) {
if let pageViewController = pageViewController {
pageViewController.setViewControllers([currentViewController],
direction: .Forward, animated: false, completion: nil)
}
}
}
}
extension SDTPageViewController: UIPageViewControllerDataSource {
func pageViewController(pageViewController: UIPageViewController,
viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
return goFowardPage(viewController)
}
func pageViewController(pageViewController: UIPageViewController,
viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
return goBackPage(viewController)
}
private func goBackPage(viewController: UIViewController) -> UIViewController? {
var index = (viewController as! SDTPageInnerViewController).pageIndex
if index == 0 || index == NSNotFound {
return nil
}
index -= 1
return viewControllerAtIndex(index)
}
private func goFowardPage(viewController: UIViewController) -> UIViewController? {
var index = (viewController as! SDTPageInnerViewController).pageIndex
if index == NSNotFound {
return nil;
}
index += 1
if index == imageFiles.count {
return nil;
}
return self.viewControllerAtIndex(index)
}
private func viewControllerAtIndex(index:Int) -> SDTPageInnerViewController? {
if imageFiles.count == 0 || index >= imageFiles.count {
return nil
}
if let vc = UIStoryboard.getViewController("Main", identifier: "SDTPageInnerViewController") as? SDTPageInnerViewController {
vc.pageIndex = index
vc.filePath = imageFiles[index]
return vc
}
return nil
}
}
extension SDTPageViewController: UIPageViewControllerDelegate {
func pageViewController(pageViewController: UIPageViewController,
didFinishAnimating finished: Bool,
previousViewControllers: [UIViewController],
transitionCompleted completed: Bool) {
if let vc = pageViewController.viewControllers?.first as? SDTPageInnerViewController {
print(vc.pageIndex)
}
}
}
extension UIStoryboard {
static func getViewController<T: UIViewController>(storyboardName: String, identifier: String) -> T? {
return UIStoryboard(name: storyboardName, bundle: nil).instantiateViewControllerWithIdentifier(identifier) as? T
}
}
페이지 당 ViewController
SDTPageInnerViewController.swiftimport UIKit
class SDTPageInnerViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
var pageIndex = 0
var filePath = ""
override func viewDidLoad() {
super.viewDidLoad()
setup()
}
private func setup() {
imageView.image = UIImage(named: filePath)
}
}
요약
UIPageViewController에서 자주 사용하는 Tips를 모았습니다.
다음 번은 핀치나 더블 탭으로 확대·축소하는 방법을 모으고 싶습니다.
이상입니다.
Reference
이 문제에 관하여([Swift] UIPageViewController의 Tips 정리 (초급편)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/eKushida/items/d4fe95576a86f9e1d9fb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
애니메이션 유형
UIPageViewControllerTransitionStyle
상수
설명
.Scroll
페이지 넘기기
.PageCurl
종이 넘기기
넘기는 방향
UIPageViewControllerNavigationOrientation
상수
설명
.Horizontal
가로
.Vertical
세로 방향
페이지를 보내는 방향
(1) 순방향
・가로 방향의 경우는 왼쪽으로 스와이프로 이동
· 세로 방향의 경우 위로 스 와이프로 이동
샘플 코드
extension SDTPageViewController: UIPageViewControllerDataSource {
func pageViewController(pageViewController: UIPageViewController,
viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
return goFowardPage(viewController)
}
func pageViewController(pageViewController: UIPageViewController,
viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
return goBackPage(viewController)
}
private func goBackPage(viewController: UIViewController) -> UIViewController? {
var index = (viewController as! SDTPageInnerViewController).pageIndex
if index == 0 || index == NSNotFound {
return nil
}
index -= 1
return viewControllerAtIndex(index)
}
private func goFowardPage(viewController: UIViewController) -> UIViewController? {
var index = (viewController as! SDTPageInnerViewController).pageIndex
if index == NSNotFound {
return nil;
}
index += 1
if index == imageFiles.count {
return nil;
}
return self.viewControllerAtIndex(index)
}
private func viewControllerAtIndex(index:Int) -> SDTPageInnerViewController? {
if imageFiles.count == 0 || index >= imageFiles.count {
return nil
}
if let vc = UIStoryboard.getViewController("Main", identifier: "SDTPageInnerViewController") as? SDTPageInnerViewController {
vc.pageIndex = index
vc.filePath = imageFiles[index]
return vc
}
return nil
}
}
(2) 역방향
・횡방향의 경우는, 오른쪽으로 스와이프로 이동
・세로 방향의 경우는 아래로 스와이프로 이동
순방향으로 넘기는 패턴과 goFowardPage와 goBackPage를 반대로 하면 됩니다.
샘플
extension SDTPageViewController: UIPageViewControllerDataSource {
func pageViewController(pageViewController: UIPageViewController,
viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
return goBackPage(viewController)
}
func pageViewController(pageViewController: UIPageViewController,
viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
return goFowardPage(viewController)
}
}
지정 페이지로 이동
슬라이더와 연동시키거나, 도중에서 읽는 등에 이용할 수 있습니다
샘플 코드
func scrollToPage(pageIndex: Int) {
if let currentViewController = viewControllerAtIndex(pageIndex) {
if let pageViewController = pageViewController {
pageViewController.setViewControllers([currentViewController],
direction: .Forward, animated: false, completion: nil)
}
}
}
페이지 번호 얻기
자신의 페이지 컨트롤러와 페이지 번호를 표시하는 데 사용할 수 있습니다.
샘플 코드
extension SDTPageViewController: UIPageViewControllerDelegate {
func pageViewController(pageViewController: UIPageViewController,
didFinishAnimating finished: Bool,
previousViewControllers: [UIViewController],
transitionCompleted completed: Bool) {
if let vc = pageViewController.viewControllers?.first as? SDTPageInnerViewController {
//ページ番号を表示
print(vc.pageIndex)
}
}
}
옵션
추천은 페이지 사이에 여백을 지정할 수 있는 옵션입니다.
해당 페이지를 표시할 때 여백이 표시되지 않지만,
페이지를 넘기면 페이지 사이에 여백이 생깁니다.
상수
설명
UIPageViewControllerOptionInterPageSpacingKey
여백 지정
샘플 코드
pageViewController = UIPageViewController(transitionStyle: .Scroll,
navigationOrientation: .Horizontal,
options: [UIPageViewControllerOptionInterPageSpacingKey : 20])
참고 소스 코드
언제나 과거에 작성한 소스 코드를 복사하고 있으므로, 여기에 메모로 남겨 둡니다.
가로 스크롤로, 순방향으로 페이지가 넘기는 샘플입니다.
(덧붙여서, StoryBoard는 할애합니다. 양해 바랍니다.)
기초 ViewController
SDTPageViewController.swift
import UIKit
class SDTPageViewController : UIViewController {
private var pageViewController:UIPageViewController!
private var imageFiles = ["image01.jpeg","image02.jpeg","image03.jpeg","image04.jpeg","image05.jpeg"]
private var pageIndex = 0
override func viewDidLoad() {
super.viewDidLoad()
setup()
}
private func setup() {
if let startingViewController = viewControllerAtIndex(0) {
pageViewController = UIPageViewController(transitionStyle: .Scroll,
navigationOrientation: .Horizontal,
options: [UIPageViewControllerOptionInterPageSpacingKey : 20])
if let pageViewController = pageViewController {
pageViewController.dataSource = self
pageViewController.delegate = self
pageViewController.setViewControllers([startingViewController],
direction: .Forward,
animated: false,
completion: {done in})
pageViewController.view.frame = self.view.frame
addChildViewController(pageViewController)
self.view.addSubview(pageViewController.view)
}
}
}
func scrollToPage(pageIndex: Int) {
if let currentViewController = viewControllerAtIndex(pageIndex) {
if let pageViewController = pageViewController {
pageViewController.setViewControllers([currentViewController],
direction: .Forward, animated: false, completion: nil)
}
}
}
}
extension SDTPageViewController: UIPageViewControllerDataSource {
func pageViewController(pageViewController: UIPageViewController,
viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
return goFowardPage(viewController)
}
func pageViewController(pageViewController: UIPageViewController,
viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
return goBackPage(viewController)
}
private func goBackPage(viewController: UIViewController) -> UIViewController? {
var index = (viewController as! SDTPageInnerViewController).pageIndex
if index == 0 || index == NSNotFound {
return nil
}
index -= 1
return viewControllerAtIndex(index)
}
private func goFowardPage(viewController: UIViewController) -> UIViewController? {
var index = (viewController as! SDTPageInnerViewController).pageIndex
if index == NSNotFound {
return nil;
}
index += 1
if index == imageFiles.count {
return nil;
}
return self.viewControllerAtIndex(index)
}
private func viewControllerAtIndex(index:Int) -> SDTPageInnerViewController? {
if imageFiles.count == 0 || index >= imageFiles.count {
return nil
}
if let vc = UIStoryboard.getViewController("Main", identifier: "SDTPageInnerViewController") as? SDTPageInnerViewController {
vc.pageIndex = index
vc.filePath = imageFiles[index]
return vc
}
return nil
}
}
extension SDTPageViewController: UIPageViewControllerDelegate {
func pageViewController(pageViewController: UIPageViewController,
didFinishAnimating finished: Bool,
previousViewControllers: [UIViewController],
transitionCompleted completed: Bool) {
if let vc = pageViewController.viewControllers?.first as? SDTPageInnerViewController {
print(vc.pageIndex)
}
}
}
extension UIStoryboard {
static func getViewController<T: UIViewController>(storyboardName: String, identifier: String) -> T? {
return UIStoryboard(name: storyboardName, bundle: nil).instantiateViewControllerWithIdentifier(identifier) as? T
}
}
페이지 당 ViewController
SDTPageInnerViewController.swift
import UIKit
class SDTPageInnerViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
var pageIndex = 0
var filePath = ""
override func viewDidLoad() {
super.viewDidLoad()
setup()
}
private func setup() {
imageView.image = UIImage(named: filePath)
}
}
요약
UIPageViewController에서 자주 사용하는 Tips를 모았습니다.
다음 번은 핀치나 더블 탭으로 확대·축소하는 방법을 모으고 싶습니다.
이상입니다.
Reference
이 문제에 관하여([Swift] UIPageViewController의 Tips 정리 (초급편)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/eKushida/items/d4fe95576a86f9e1d9fb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여([Swift] UIPageViewController의 Tips 정리 (초급편)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/eKushida/items/d4fe95576a86f9e1d9fb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)