简体   繁体   中英

swift: UIPageViewController size

I have UIPageViewController with spine mid location. Now my 2 pages occupy the whole screen. But I want to change size of my flipping pages that I can create buttons in other part of controller. How to do it?

code:

import UIKit

class PageViewController: UIViewController {

    @IBOutlet weak var PageControl: UIPageControl!

    var pageViewController: UIPageViewController?
    var images = ["book1page1.png","book1","book1","book1page2.png","book1page1.png","book1page2.png"]
    var pendingIndex: Int?

    override func viewDidLoad() {
        super.viewDidLoad()

        createPageViewController()
        setupPageControll()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func createPageViewController() {
        // Instantiate the PageViewController
        let pageController = self.storyboard?.instantiateViewController(withIdentifier: "PageViewController") as! UIPageViewController
        pageController.dataSource = self
        pageController.delegate = self

        if images.count > 0{
            let firstController = getContentViewController(withIndex: 0)!
            let contentControllers = [firstController]

            pageController.setViewControllers(contentControllers, direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)

        }

        pageViewController = pageController

        self.addChildViewController(pageViewController!)

        //self.view.addSubview(pageViewController!.view)
        self.view.insertSubview(pageViewController!.view, at: 0)
        pageViewController!.didMove(toParentViewController: self)

    }

    //Setup Pagination Icons and count
    func presentationCount(for pageViewController: UIPageViewController) -> Int {
        return images.count
    }

    func presentationIndex(for pageViewController: UIPageViewController) -> Int {
        return 0
    }

    func setupPageControll(){
        let apperance = UIPageControl.appearance()
        apperance.pageIndicatorTintColor = UIColor.gray
        apperance.currentPageIndicatorTintColor = UIColor.white
        apperance.backgroundColor = UIColor.clear
    }

    func currentControllerIndex() -> Int{
        let pageItemController = self.currentConroller()

        if let controller = pageItemController as? ContentViewController {
            return controller.itemIndex
        }
        return -1
    }

    ///////////////////////////////////////////////

    func currentConroller() -> UIViewController?{
        if (self.pageViewController?.viewControllers?.count)! > 0{
            return self.pageViewController?.viewControllers![0]
        }

        return nil
    }

    func getContentViewController(withIndex index: Int) -> ContentViewController? {
        if index < images.count{
            let contentVC = self.storyboard?.instantiateViewController(withIdentifier: "ContentViewController") as! ContentViewController
            contentVC.itemIndex = index
            contentVC.imageName = images[index]

            return contentVC
        }

        return nil
    }

}

extension PageViewController: UIPageViewControllerDataSource, UIPageViewControllerDelegate {

    func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
        pendingIndex = (pendingViewControllers.first as! ContentViewController).itemIndex
    }

    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        if completed {
            let currentIndex = pendingIndex
            if let index = currentIndex {
                self.PageControl.currentPage = index
            }

        }
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        let contentVC = viewController as! ContentViewController
        if contentVC.itemIndex > 0 {
            return getContentViewController(withIndex: contentVC.itemIndex - 1)
        }

        return nil
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        let contentVC = viewController as! ContentViewController
        if contentVC.itemIndex + 1 < images.count {
            return getContentViewController(withIndex: contentVC.itemIndex + 1)
        }

        return nil
    }
}

Here you have instantiate UIPageViewController (id:"PageViewController") and add as subview inside the UIViewController so if you want create UIButton you can create but if its want to visible in front of this UIPageViewController You can put self.view.insertSubview(pageViewController!.view, at: 0) to says your UIViewController to put this subview at index 0 (means behind the every subviews)

Below I have given code: Add Subview at index 0 and Make Size of the PageViewController using pageController.view.frame = CGRect(x: 50, y: 50, width: self.view.frame.width - (5.0 * 20.0), height: self.view.frame.height - (2.0 * 50.0)) also Added two buttons calls "Next" and "Previous' at the bottom of UIPageController

Check Blow Code:

func createPageViewController() {
        let pageController = self.storyboard?.instantiateViewController(withIdentifier: "PageViewController") as! UIPageViewController

        pageController.isDoubleSided = true
        pageController.dataSource = self
        pageController.delegate = self

        if images.count > 1{
            let firstController = getContentViewController(withIndex: 0)!
            let secondController = getContentViewController(withIndex: 1)!
            let contentControllers = [firstController,secondController]
            pageController.setViewControllers(contentControllers, direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)

        }

        pageViewController = pageController
        self.addChildViewController(pageViewController!)
        self.view.insertSubview(pageViewController!.view, at: 0)

        pageController.view.frame = CGRect(x: 50, y: 50, width: self.view.frame.width - (5.0 * 20.0), height: self.view.frame.height - (2.0 * 50.0))
        pageController.view.layer.borderColor = UIColor.lightGray.cgColor
        pageController.view.layer.borderWidth = 1.0
        pageViewController!.didMove(toParentViewController: self)

        //Next Page Button
        let nextButton = UIButton()
        nextButton.frame = CGRect(x: pageController.view.frame.maxX - 75, y: pageController.view.frame.maxY + 5, width: 75, height: 50)
        nextButton.backgroundColor = UIColor.blue
        nextButton.setTitle("Next", for: .normal)
        nextButton.addTarget(self, action: #selector(buttonActionNext), for: .touchUpInside)
        self.view.addSubview(nextButton)

        //Previous Page Button
        let previousButton = UIButton()
        previousButton.frame = CGRect(x: pageController.view.frame.minX, y: pageController.view.frame.maxY + 5, width: 75, height: 50)
        previousButton.backgroundColor = UIColor.blue
        previousButton.setTitle("Previous", for: .normal)
        previousButton.addTarget(self, action: #selector(buttonActionPrevious), for: .touchUpInside)
        self.view.addSubview(previousButton)
    }

    @objc func buttonActionNext(sender: UIButton!) {
        print("Next page")
    }

    @objc func buttonActionPrevious(sender: UIButton!) {
        print("Previous Page")
    }

You need to change the frame

 pageViewController!.view.frame = ///
 self.view.insertSubview(pageViewController!.view, at: 0)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM