自动移动页面控制点

时间:2017-02-10 06:53:51

标签: ios swift

我实现了Page控制器..在swift中自动移动页面

但我的问题是页面控制器点没有改变不表示页面任何人帮我解决这个问题  这是我的代码

 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)


        }

任何人都可以帮我解决这个问题,当自动滚动页面时..pagecontroll点也会被移动 提前致谢

3 个答案:

答案 0 :(得分: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

}

添加此代码,这是页面控制器的委托方法 它会工作正常 快乐代码:)

答案 1 :(得分:1)

尝试更改

pagecontroller.currentPage = 0

pagecontroller.currentPage = UpdateCounter

您在func AdvancedPage

中重置了当前值
    pagecontroller.currentPage = UpdateCounter

    pagecontroller.numberOfPages = 3
    pagecontroller.currentPage = 0

只需删除“pagecontroller.currentPage = 0”即可。

尝试这个(我只知道objective-c代码,尝试在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];
    }
}

记住set delegate

pagecontroller.delegate = self

来自Another related answer

  

如果两种方法都已实施,页面指示器将可见   过渡样式是'UIPageViewControllerTransitionStyleScroll',和   导航方向是   'UIPageViewControllerNavigationOrientationHorizo​​ntal'。两种方法   被调用以响应'setViewControllers:...'调用,但是   演示文稿索引会自动更新   手势驱动的导航。

您还需要实现以下函数来设置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.

答案 2 :(得分:0)

实现了自定义页面控件,您可以在其中轻松更改大小,颜色,形状和页码...这是课程

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
        }
    }

}

这是实施

var pageControl = PageControl()

和viewDidLoad添加此代码

 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)

并在委托方法中更改您的页码

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)


    }