3

I implement the Page controller ..automatically moving the page in swift

but my issue is the page controller dots not getting changed not indicates the page any one help me to solve this issue here is my code

 override func viewDidLoad() {
        super.viewDidLoad()

        UpdateCounter = 0

        arrPageTitle = ["In SignUp screen user can able to input the first name, last name, emailid and password.", "After SignUp email verification link has been send to his mail then add basic profile information and sport preferences.", "In Profile setting can view profile, privacy and notifications, friends, account and championships won."];

        self.pageViewController = self.storyboard?.instantiateViewController(withIdentifier: "myPageviewcontroller") as! UIPageViewController
        self.pageViewController.dataSource = self
        let initialContentviewcontroller = self.getViewControllerAtIndex(index: 0) as PageContentViewController
        let viewcontrollers = NSArray(object: initialContentviewcontroller)
        self.pageViewController.setViewControllers(viewcontrollers as? [UIViewController], direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)

        self.pageViewController.view.frame = CGRect(x: 0, y: 50, width:self.view.frame.width,height: 350)
        //pagecontroller.delegate = self
        pagecontroller.numberOfPages = arrPageTitle.count
        pagecontroller.currentPage = 0;

        self.addChildViewController(self.pageViewController)
        self.view.addSubview(self.pageViewController.view)
        self.pageViewController.didMove(toParentViewController: self)



        timer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: (#selector(StartUpPage.advancePage)), userInfo: nil, repeats: true)

    }

    func getViewControllerAtIndex(index: Int) -> PageContentViewController
    {
        // Create a new view controller and pass suitable data.

        let pageContentViewController = self.storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController
        pageContentViewController.strTitle = "\(arrPageTitle[index])"
        pageContentViewController.pageIndex = index
        return pageContentViewController
    }


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


        let viewController = viewController as! PageContentViewController
        var index = viewController.pageIndex as Int
        if(index == 0 || index == NSNotFound)
        { return nil
        }

        index -= 1

        return self.getViewControllerAtIndex(index: index)

    }



    public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
    {
        let viewController = viewController as! PageContentViewController
        var index = viewController.pageIndex as Int
        if(( index == NSNotFound))
        {
            return nil
        }

        index += 1
        if(index == arrPageTitle.count)
        {

            return nil
        }

            return self.getViewControllerAtIndex(index: index)


    }


    public func presentationCount(for pageViewController: UIPageViewController) -> Int
    {
        return arrPageTitle.count

    }


    public func presentationIndex(for pageViewController: UIPageViewController) -> Int
    {
        let viewController = self.getViewControllerAtIndex(index: 0)
        let index = viewController.pageIndex as Int
        return index

    }
    func advancePage ()
    {
        UpdateCounter += 1

        if  UpdateCounter > 2 {
            UpdateCounter = 0

        }
        var nextviewcontroller = self.getViewControllerAtIndex(index: UpdateCounter)
        if (nextviewcontroller .isEqual(nil)) {
            UpdateCounter = 0

            nextviewcontroller = self.getViewControllerAtIndex(index: UpdateCounter)
        }

        let startingViewControllers = [nextviewcontroller]
        pageViewController.setViewControllers(startingViewControllers, direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)
        pagecontroller.currentPage = UpdateCounter

        pagecontroller.numberOfPages = 3
        pagecontroller.currentPage = 0
        pagecontroller.addTarget(self, action: #selector(pageControlTapHandler(sender:)), for: .touchUpInside)


        }

Any one help me how to solve this issues when auto scroll the page ..pagecontroll dots also get moved Thanks in advance

tRx
  • 815
  • 1
  • 15
  • 24
Agaram
  • 93
  • 2
  • 13

3 Answers3

2
public func presentationIndex(for pageViewController: UIPageViewController) -> Int
{
   let viewController = pageViewController.viewControllers?[0] as! PageContentViewController

    let index = viewController.pageIndex
    pagecontroller.currentPage = index
    UIPageControl.appearance().pageIndicatorTintColor = UIColor.lightGray
    UIPageControl.appearance().currentPageIndicatorTintColor = UIColor.red


    return index

}

add this code this is delegate method for page controller It will Work fine Happy Code:)

fathima
  • 181
  • 12
1

try change

pagecontroller.currentPage = 0

to

pagecontroller.currentPage = UpdateCounter

You reseted the current in func AdvancedPage

    pagecontroller.currentPage = UpdateCounter

    pagecontroller.numberOfPages = 3
    pagecontroller.currentPage = 0

just delete "pagecontroller.currentPage = 0" is ok.


try this (I only know objective-c codes, try to use it in swift)

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed {
    if (finished) {
        YourViewControllersInPageController *childViewController = [pageViewController.viewControllers firstObject];
        [self.pageControl setCurrentPage:childViewController.index];
    }
}

remember set delegate

pagecontroller.delegate = self

From Another related answer

A page indicator will be visible if both methods are implemented, transition style is 'UIPageViewControllerTransitionStyleScroll', and navigation orientation is 'UIPageViewControllerNavigationOrientationHorizontal'. Both methods are called in response to a 'setViewControllers:...' call, but the presentation index is updated automatically in the case of gesture-driven navigation.

You also need to implement below functions to set the page counts for UIPageViewController

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController NS_AVAILABLE_IOS(6_0); // The number of items reflected in the page indicator.
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController NS_AVAILABLE_IOS(6_0); // The selected item reflected in the page indicator.
Community
  • 1
  • 1
KTang
  • 340
  • 1
  • 17
  • thanks for the response but still the dots not moving its same place – Agaram Feb 10 '17 at 07:52
  • auto scroll label but the pageindicator circle not changing the color is not getting move ..i add the code also pagecontroller.currentPage = UpdateCounter pagecontroller.numberOfPages = 3 UIPageControl.appearance().pageIndicatorTintColor = UIColor.lightGray UIPageControl.appearance().currentPageIndicatorTintColor = UIColor.red – Agaram Feb 10 '17 at 07:54
  • what u given above i implemnted bro its not working bro ...its scrolled automatically but the dots indicator not chaning the color bro – Agaram Feb 10 '17 at 10:30
0

have implemented a custom page control with the help of which you can change your size , color , shape and page number very easily ... here is the class

import UIKit
import PureLayout

extension PageControl {
    func setupView() {
    for subview in subviews {
        subview.removeFromSuperview()
    }
    pages.removeAll(keepingCapacity: true)

    container = UIView(frame: CGRect.zero)
    self.addSubview(container!)

    container?.autoCenterInSuperview()
    container?.autoPinEdge(toSuperviewEdge: .top)
    container?.autoPinEdge(toSuperviewEdge: .bottom)

    for index in 0 ..< totalPages {
        let page = UIView()
        container?.addSubview(page)
        pages.append(page)

        page.autoMatch(.width, to: .height, of: page)
        page.autoPinEdge(toSuperviewEdge: .top, withInset: padding)
        page.autoPinEdge(toSuperviewEdge: .bottom, withInset: padding)

        if index == 0 {
            page.autoPinEdge(toSuperviewEdge: .left, withInset: padding, relation: .greaterThanOrEqual)
        } else if index == totalPages-1 {
            page.autoPinEdge(toSuperviewEdge: .right, withInset: padding, relation: .greaterThanOrEqual)
        } else {
            page.autoPinEdge(.left, to: .right, of: pages[index-1], withOffset: padding)
        }
    }

    let size = frame.height - padding * 2
    let width = padding * CGFloat(totalPages+1) + size * CGFloat(totalPages)
    container?.autoSetDimension(.width, toSize: width)



        //layoutIfNeeded()
        setNeedsDisplay()
    }
}

@IBDesignable class PageControl: UIControl {

    var container:UIView?
    var pages = [UIView]()

    @IBInspectable var currentPage:Int = 0 {
        didSet {
            setNeedsLayout()
        }
    }
    @IBInspectable var allPagesColor: UIColor = Colors.greyELight {
        didSet {
            setNeedsDisplay()
        }
    }
    @IBInspectable var currentPageColor: UIColor = Colors.green {
        didSet {
            setNeedsDisplay()
        }
    }

    @IBInspectable var totalPages: Int = 3 {
        didSet {
            if totalPages > 0 {
                setupView()
            }
        }
    }

    @IBInspectable var padding: CGFloat = 2 {
        didSet {
            if padding > 0 {
                setupView()
            }
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupView()
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        let size = frame.height - padding * 2

        for (index, view) in pages.enumerated() {
            view.layer.cornerRadius = size / 2
            view.layer.masksToBounds = true


 view.backgroundColor = (index == currentPage) ? currentPageColor: allPagesColor
        }
    }

}

here is the implentation

var pageControl = PageControl()

and viewDidLoad add this code

 let f = CGRect(x: CGFloat(0), y: CGFloat.adjustYAxis(91), width: CGFloat.adjustXAxis(100), height: CGFloat.adjustYAxis(6))
            pageControl = PageControl(frame:f)
            pageControl.totalPages = 5
            pageControl.tag = 716
            pageControl.delegate = self
            pageControl.allPagesColor = UIColor(hexString:"#afc6de")
            let firstMood = self.moodsArray[0] as! MoodsModel
            pageControl.currentPageColor =  UIColor(hexString: firstMood.MoodBackGroundColor!)
            pageControl.currentPage = 0
            pageControl.padding = 10
            self.pageViewController.view.addSubview(pageControl)

and change you page number in delegate methods just like that

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


        let viewController = viewController as! PageContentViewController
        var index = viewController.pageIndex as Int
        if(index == 0 || index == NSNotFound)
        { return nil
        }

        index -= 1
       pageControl.currentPage = index
        return self.getViewControllerAtIndex(index: index)

    }



    public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
    {
        let viewController = viewController as! PageContentViewController
        var index = viewController.pageIndex as Int
        if(( index == NSNotFound))
        {
            return nil
        }

        index += 1
        if(index == arrPageTitle.count)
        {

            return nil
        }
pageControl.currentPage = index
            return self.getViewControllerAtIndex(index: index)


    }
Naveed Khan
  • 338
  • 4
  • 16
  • Hi Bro Its not working bro i dont have any problem to move the next view ...its auto scroll pagecontoller working fine my problem is when auto scroll the page the page indicator dots not moving automatically – Agaram Feb 10 '17 at 10:24
  • The class i have share with you is used only for page indicators (Dots) .. can you tell me where you are facing the issue .. One important thing you have to install a cocoapods name "PureLayout" in your project .. it will help you to set your constraints on page indicators ... – Naveed Khan Feb 13 '17 at 08:21