【问题标题】:How do I implement UIPageControl in Swift如何在 Swift 中实现 UIPageControl
【发布时间】:2014-09-07 20:43:10
【问题描述】:

好的,所以我在这里苦苦挣扎,无法找到可行的解决方案。在没有 Objective C 经验的情况下,我一直在自学 Swift(我知道,我知道)。

在我的应用程序中,我有我的主 UIViewController,一个透明但从屏幕底部滑入的子视图,然后是滑动子视图的 4 个子视图,它们都是工作 UIScrollView。我启用了分页并且效果很好,但我想为它们中的每一个添加一个 UIPageControl。我真的无法掌握代表以及如何实现使用 swift。任何帮助将非常感激!

另外,我以编程方式完成这一切,所以请不要使用 IB。如果有帮助,很乐意提供代码。谢谢

【问题讨论】:

    标签: ios uiscrollview swift uipagecontrol


    【解决方案1】:

    我认为您和/或任何寻找如何执行此操作的其他人会发现 this answer 很有帮助。该代码示例使我能够在我的 scrollView 上创建一个页面控制指示器,这是第一次尝试这样做。我发现它很清楚。

    您可能需要添加到项目中的行是:

    1:当您第一次命名视图控制器类时,添加UIScrollViewDelegate 作为协议。

    2:在类声明中创建一个pageControl 变量。您将需要使用帧编号以使其出现在您想要的位置。当前的数字在我的窗口中间占了一个。 供参考的数字平均值(指示器左上角的 x 位置,左上角的 y 坐标,页面指示器的宽度,页面指示器的高度)

    var pageControl : UIPageControl = UIPageControl(frame: CGRectMake(50, 300, 200, 20))

    1. 在 viewDidLoad 中设置 scrollView 委托并调用 `configurePageControl():

      override func viewDidLoad() {
          super.viewDidLoad()
      
          scrollView.delegate = self
      
          configurePageControl()
      }
      
    2. 需要在 viewDidLoad 之后添加两个方法。一个在 viewDidLoad 中调用

      func configurePageControl() {
           self.pageControl.numberOfPages = <some reference to the number of pages>
           self.pageControl.currentPage = 0
           self.pageControl.tintColor = UIColor.redColor()
           self.pageControl.pageIndicatorTintColor = UIColor.blackColor()
           self.pageControl.currentPageIndicatorTintColor = UIColor.greenColor()     
           self.view.addSubview(pageControl)
       }
      

       func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
          let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
          pageControl.currentPage = Int(pageNumber)
      }
      

    scrollView 委托的设置实际上非常简单。添加 UIScollViewDelegate 作为您的 ViewController 类将实现的协议,方法是在类声明之后添加它:class YourClassName: UIScrollViewDelegate。然后在 viewDidLoad() 中,通过使用 scrollView.delegate = self 行将滚动视图的委托属性分配给您的类来完成委托设置。 (如果您需要进一步说明这些命令的去向,请再次查看我链接的示例)

    【讨论】:

      【解决方案2】:

      使用 Swift 4 的 UIPageControl 集成

      func configurePageControl() {
          self.pageview.numberOfPages = items.count
          self.pageview.currentPage = 0
          self.pageview.tintColor = UIColor.red
          self.pageview.pageIndicatorTintColor = UIColor.black
          self.pageview.currentPageIndicatorTintColor = UIColor.green
      }
      

      【讨论】:

        【解决方案3】:

        只需像这样在代码中设置它:

        private var pageControl = UIPageControl(frame: .zero)
        
        private func setupPageControl() {
        
            pageControl.numberOfPages = controllers.count
            pageControl.translatesAutoresizingMaskIntoConstraints = false
            pageControl.currentPageIndicatorTintColor = UIColor.orange
            pageControl.pageIndicatorTintColor = UIColor.lightGray.withAlphaComponent(0.8)
        
            let leading = NSLayoutConstraint(item: pageControl, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1, constant: 0)
            let trailing = NSLayoutConstraint(item: pageControl, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1, constant: 0)
            let bottom = NSLayoutConstraint(item: pageControl, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0)
        
            view.insertSubview(pageControl, at: 0)
            view.bringSubview(toFront: pageControl)
            view.addConstraints([leading, trailing, bottom])
        }
        

        【讨论】:

        • 我已经设法使用您的功能设置页面控制指示器,非常感谢。但是,当页面更改时,指示器不会更改。每当我更改页面时,我都尝试通过设置pageControl.currentPage 来修复它,但效果不佳。我有 3 页,并且页面指示器只是在两个极端之间跳跃,它从不取中间值。我应该在哪里设置pageControl.currentPage 才能正常工作?
        • 您可以在 pageViewController(_:didFinishAnimating:previousViewControllers:transitionCompleted:) 中更新 pageControl.currentPage 的代码。您必须为此实现 PageViewControllerDelegate。文档在这里developer.apple.com/documentation/uikit/…
        【解决方案4】:

        委托只是一个类的方法,可以转交给另一个类。这些方法通常是回调。

        例如当用户点击返回时,TextField 的回调可以在 Delegate 中实现。委托可以在 ViewController 类中实现。

        现在当用户点击返回时,TextField 对象将调用 ViewController 对象中的委托方法。这样做的好处是,您可以从委托方法访问 ViewController 对象的所有变量和方法。否则,您将需要 TextField 对象本身内的 ViewController 对象的句柄。

        委托被实现为协议,它们只是接口。因此,如果 ViewController 实现了 TextFieldDelegate 协议,则可以从 ViewController 对象中调用所有文本字段回调。

        我希望这会有所帮助。

        【讨论】:

        • 那肯定开始了!所以在我的情况下,我可能会让我的透明子视图(UIPageControl 所在的位置)实现委托,对吗?还是应该直接进入 ViewController?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-02
        • 1970-01-01
        • 1970-01-01
        • 2015-11-30
        • 2016-11-27
        • 2017-04-30
        • 1970-01-01
        相关资源
        最近更新 更多