용기 보기 controller를 사용하여 페이지 컨트롤을 보기의 일부분에 삽입합니다

18559 단어 SwiftiOS
iOS 애플리케이션의view 일부에 페이지 제어로 전환된view가 삽입돼 있어 메모를 진행했다.
완성된 인상은 이렇다.

작업 환경

  • Xcode 7.3
  • iOS 9.3
  • 이루어지다


    모 뷰


    먼저 부모의 관점에서 시작한다.
    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
  • 추가
  • 아이의view를 자신의view에 추가

  • 보기 컨트롤러 증가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(_:)에 호출 표시기 수량 설정
  • 3개
  • 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 앱은 이런 느낌을 실현했다.

    참고 자료

  • Container View Controller의 올바른 사용
  • 좋은 웹페이지 즐겨찾기