Using Page View Controller inside Tab Swift

非 Y 不嫁゛ 提交于 2019-12-08 09:41:51

问题


MY WORK SO FAR:

So I have a Tab bar that looks like this:

When I click on "Canteen" I want to be directed to a Page View Controller where I can swipe between different pages but stay on the same tab.

I have this somewhat working:

I have the Storyboard setup like this:

As you can see that segue above is coming from the Tab Bar Controller.

The third view (Can Page Item Controller, ID: "CanItemController) is used for all pages in the page view.

The second view above (Page View Controller, ID: "CanPageController) is used for controlling the Pages (duh)

The first view (CanteenViewController) contains all the code and makes all the connections. This is where everything goes on. The code inside this class is here:

import UIKit

class CanteenViewController: UIViewController, UIPageViewControllerDataSource {

    // MARK: - Variables
    private var pageViewController: UIPageViewController?

    private let contentImages = ["Radar-512.png",
        "dartp.png",
        "roomp.png",
        "abnews.png",
        "canteenp.png"];

    override func viewDidLoad() {
        super.viewDidLoad()

        createPageViewController()
        setupPageControl()            
    }

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

    private func createPageViewController() {

        let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("CanPageController") as! UIPageViewController
        pageController.dataSource = self

        if contentImages.count > 0 {
            let firstController = getItemController(0)!
            let startingViewControllers: NSArray = [firstController]
            pageController.setViewControllers(startingViewControllers as [AnyObject], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
        }

        pageViewController = pageController
        addChildViewController(pageViewController!)
        self.view.addSubview(pageViewController!.view)
        pageViewController!.didMoveToParentViewController(self)

    }

    private func setupPageControl() {

        let appearance = UIPageControl.appearance()
        appearance.pageIndicatorTintColor = UIColor.grayColor()
        appearance.currentPageIndicatorTintColor = UIColor.whiteColor()
        appearance.backgroundColor = UIColor.darkGrayColor()

    }

    // MARK: - UIPageViewControllerDataSource

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {

        let itemController = viewController as! CanPageItemController

        if itemController.itemIndex > 0 {
            return getItemController(itemController.itemIndex-1)
        }
        return nil
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {

        let itemController = viewController as! CanPageItemController

        if itemController.itemIndex+1 < contentImages.count {
            return getItemController(itemController.itemIndex+1)
        }
        return nil
    }

    private func getItemController(itemIndex: Int) -> CanPageItemController? {

        if itemIndex < contentImages.count {
            let pageItemController = self.storyboard!.instantiateViewControllerWithIdentifier("CanItemController") as! CanPageItemController
            pageItemController.itemIndex = itemIndex
            pageItemController.imageName = contentImages[itemIndex]
            return pageItemController
        }
        return nil
    }

    // MARK: - Page Indicator

    func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
        return contentImages.count
    }

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

}

I HAVE 2 PROBLEMS:

  1. I can't see any page indicators at all. This comes from the following code:

    private func setupPageControl() {
    
    let appearance = UIPageControl.appearance()
    appearance.pageIndicatorTintColor = UIColor.grayColor()
    appearance.currentPageIndicatorTintColor = UIColor.whiteColor()
    appearance.backgroundColor = UIColor.darkGrayColor()
    
    }
    

    Is there a way I can add a page indicator in the storyboard and reference that programatically. That way maybe I could add constraints and have more control. I think the page indicator might be hidden behind the Tab Bar. Though constraints are also giving me issues, which leads me to problem 2

  2. As you can see in the Item Controller, I have a UIImageView and the constraints are all set right. But when I run the app the image appears for a second (completely out of proportion) and then disappears. i.e - my constraints simply don't work properly

Question

Is my approach in general just wrong? Or is there a few little changes I can make to fix the above problems. I I've been following a tutorial (on Ray Wenderlich I think), and it all worked fine until I tried to integrate it with my Tab Bar.


回答1:


Leave all above thing, just do as following.

class CanteenViewController: UIViewController, UIScrollViewDelegate {

@IBOutlet var scrHelp: UIScrollView!
@IBOutlet var pageControl: UIPageControl!

var page = 0

let arrTitle : [String] = ["Title1", "Title2", "Title3", "Title4", "Title5"]
let arrImages : [String] = ["Radar-512.png", "dartp.png", "roomp.png", "abnews.png", "canteenp.png"];

override func viewDidLoad() {
    super.viewDidLoad()
    //self.edgesForExtendedLayout = UIRectEdge.None
    self.title = "Canteen"
    // Do any additional setup after loading the view, typically from a nib.

    self.createHelpView()

    pageControl.backgroundColor = UIColor.clearColor()
    pageControl.pageIndicatorTintColor = UIColor.lightGrayColor()
    pageControl.currentPageIndicatorTintColor = UIColor(red: 251/255, green: 108/255, blue: 108/255, alpha: 1.0)
    pageControl.tintAdjustmentMode = UIViewTintAdjustmentMode.Dimmed
    pageControl.numberOfPages = arrTitle.count
    pageControl.currentPage = 0

}

func createHelpView() {

    var x = 50
    for var i=0; i<arrTitle.count; i++  {
        var lblTitle = UILabel(frame: CGRectMake(CGFloat(x), 10, CGFloat(scrHelp.frame.width-100), 25))
        lblTitle.autoresizingMask = UIViewAutoresizing.FlexibleBottomMargin
        lblTitle.backgroundColor = UIColor.clearColor()
        lblTitle.font = UIFont.systemFontOfSize(17)
        lblTitle.textAlignment = NSTextAlignment.Center
        lblTitle.textColor = UIColor.blackColor()
        lblTitle.text = arrTitle[i]
        scrHelp.addSubview(lblTitle)

        var imgView = UIImageView(frame: CGRectMake(CGFloat(x), 50, CGFloat(scrHelp.frame.width-100), CGFloat(scrHelp.frame.height-150)))
        imgView.autoresizingMask = UIViewAutoresizing.FlexibleBottomMargin
        imgView.backgroundColor = UIColor.clearColor()
        imgView.image = UIImage(named: arrImages[i])
        imgView.contentMode = UIViewContentMode.ScaleAspectFit
        scrHelp.addSubview(imgView)

        x = x + Int(scrHelp.frame.width)
    }
    scrHelp.contentSize = CGSizeMake(CGFloat(arrTitle.count)*self.view.frame.width, 0)
}

func scrollViewDidScroll(scrollView: UIScrollView)
{
    var pageWidth = CGFloat(scrHelp.frame.width)
    var fractionalPage = scrHelp.contentOffset.x / pageWidth
    page = lround(CDouble(fractionalPage))
    pageControl.currentPage = page
}

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

At last, add UIScrollView and UIPageControl to you storyboard and set respective outlet.



来源:https://stackoverflow.com/questions/31695340/using-page-view-controller-inside-tab-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!