自动移动页面控制点

3

我正在实现页面控制器,使用 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)


        }

有人能帮我解决自动滚动页面时的问题吗?页面控制点也跟着移动了。提前感谢。

3个回答

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
尝试更改。
pagecontroller.currentPage = 0

pagecontroller.currentPage = UpdateCounter

您在 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];
    }
}

记得设置代理。
pagecontroller.delegate = self

来自另一个相关答案

如果同时实现了两种方法,转换样式为'UIPageViewControllerTransitionStyleScroll',导航方向为'UIPageViewControllerNavigationOrientationHorizontal',则页面指示器将可见。这两种方法都是响应于'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.

谢谢回复,但是点还是没有移动,仍然停留在原地。 - Agaram
自动滚动标签,但页面指示器圆圈不改变颜色也不会移动。我已经添加了代码,pagecontroller.currentPage = UpdateCounterpagecontroller.numberOfPages = 3 UIPageControl.appearance().pageIndicatorTintColor = UIColor.lightGray UIPageControl.appearance().currentPageIndicatorTintColor = UIColor.red - Agaram
你提供的代码我已经实现了,但是它没有正常工作。它自动滚动了,但是指示点的颜色没有改变。 - Agaram

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)

并且像这样在Delegate方法中更改页面编号

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)


    }

嗨兄弟,它不起作用啊,我没有任何问题可以移动到下一个视图...它的自动滚动页面控制器工作正常,我的问题是当自动滚动页面时,页面指示点不会自动移动。 - Agaram
我与你分享的类仅用于页面指示器(点)..你能告诉我你在哪里遇到了问题..一个重要的事情是你需要在项目中安装一个名为“PureLayout”的cocoapods..它将帮助你设置页面指示器上的约束条件... - Naveed Khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接