在 UIPageViewController 的 UIPageControl 中增加指示器的大小

Posted

技术标签:

【中文标题】在 UIPageViewController 的 UIPageControl 中增加指示器的大小【英文标题】:Increase the size of the indicator in UIPageViewController's UIPageControl 【发布时间】:2017-02-24 07:09:15 【问题描述】:

是否可以增加UIPageViewController中指标的大小?

我有这个:

而我的要求是这样的:

【问题讨论】:

【参考方案1】:

缩放页面控件会缩放点,但也会缩放它们之间的间距。

pageControl.transform = CGAffineTransform(scaleX: 2, y: 2)

如果要保持点之间的间距相同,则需要单独转换点:

pageControl.subviews.forEach 
    $0.transform = CGAffineTransform(scaleX: 2, y: 2)

但是,如果您在viewDidLoad 中执行此操作,则在视图出现时转换已重置,因此您应该在viewDidLayoutSubviews 中执行此操作...

override func viewDidLayoutSubviews() 
    pageControl.subviews.forEach 
        $0.transform = CGAffineTransform(scaleX: 2, y: 2)
    

【讨论】:

这是一个很好的答案,但是我怎样才能在 UIPageViewController 中获得 UIPageControl 的引用。就像我打印 UIPageViewController 的子视图一样,我只会得到 ScrollView!还是需要在storyboard中拖一个UIPageControl? 你解决过这个问题吗?我对如何引用 pageControl 有同样的困惑。我是否在 UIPageViewController 中以某种方式执行此操作?我想要的只是更大的点,并且缩放它们之间的距离也可以。 请注意,虽然这是一个聪明的答案,但 Apple 不支持您进入框架控件并操纵其私有视图层次结构。这是脆弱的,今天有效的方法可能会改变未来版本的行为。 @DuncanC Apple 可能不支持它,但它仍然允许它。例如,当您自定义 NavigationBar 时也是如此。你只需要避免使用私有符号。 在 C# 或 Xamarin.ios 中像这样使用 myPageControl.Transform = CGAffineTransform.MakeScale(2, 2);【参考方案2】:

您可以使用UIPageControl 并像这样缩放它:

@IBOutlet weak var pageControl: UIPageControl!

 override func viewDidLoad() 
    super.viewDidLoad()
    pageControl.transform = CGAffineTransform(scaleX: 2, y: 2); //set value here

这样做的问题是你的点之间的空间也会增加。如果您想对您的点进行准确的设计,您必须使用 3party 控件:https://www.cocoacontrols.com/

【讨论】:

我在问题中提到我正在使用 UIPageViewController。 @AnuragSharma 我知道,当我们想要对点进行更多控制时,UIPageControl 与 UIPageViewController 一起使用。这并非不兼容。没有办法只用 UIPageViewController 做你想做的事 你说的很对,但是我们可以在“viewDidLayoutSubviews()”中获取“UIPageControl”的引用,并根据需要进行修改。我们可以改变点之间的空间看看@Ashley Mills 的回答【参考方案3】:

为 swift 2.0 增加或减少 pageControl Indicator 的大小

self.pageControl.transform = CGAffineTransformMakeScale(0.8, 0.8)

self.pageControl.transform = CGAffineTransformMakeScale(1.3, 1.3)

【讨论】:

或反之亦然:1.3 是增加的。使用 CGAffineTransformMakeScale 让我对 Obj-C 更清楚。 你要的是objective-c吗? 不,谢谢。您的示例,而不是早期的示例,帮助我将解决方案转换为 Objective-C。 self.pageControl.transform = CGAffineTransformMakeScale(1.8, 1.8);【参考方案4】:

Swift 4、4.2 和 5

首先创建一个页面控件的outlet

@IBOutlet weak var pageControl: UIPageControl!

如果你想保持原来的间距。

override func viewDidLayoutSubviews() 
        pageControl.transform = CGAffineTransform(scaleX: 2, y: 2)

如果你不想保持原来的间距。

override func viewDidLayoutSubviews() 
        pageControl.subviews.forEach 
            $0.transform = CGAffineTransform(scaleX: 2, y: 2)
        

【讨论】:

【参考方案5】:

首先,在 viewDidLoad() 内部创建一个 uiPageControl 对象,然后根据您的要求设置它的 y 位置,然后使用 CAAffiniteTransform 应用所需的比例,如下所示:

        var pageControl = UIPageControl()
        pageControl.pageIndicatorTintColor = UIColor.gray
        pageControl.currentPageIndicatorTintColor = UIColor.yellow

        pageControl.transform = CGAffineTransform(scaleX: 1.3, y: 1.3) // set dot scale of pageControl

        pageControl.backgroundColor = UIColor.darkGray
        pageControl.numberOfPages = 3
        pageControl.center = self.view.center 
        self.view.addSubview(pageControl) // add pageControl to view

        pageControl.layer.position.y = self.view.frame.height - 100; // y position of the pageControl

【讨论】:

【参考方案6】:

向页面控制器添加扩展

extension UIPageControl 
    func customPageControl(dotWidth: CGFloat) 
        for (pageIndex, dotView) in self.subviews.enumerated() 
            dotView.frame.size = CGSize.init(width: dotWidth, height: dotWidth)
        
    

【讨论】:

这是设置框架而不是约束的问题。 在 LayoutSubview 中或页面控制器发生变化时调用此方法,以便相应调整

以上是关于在 UIPageViewController 的 UIPageControl 中增加指示器的大小的主要内容,如果未能解决你的问题,请参考以下文章

ViewDidLoad 不断在 UIPageViewController 上被调用

在故事板中使用 UIPageViewController

带有 Peeking 的 UIPageViewController

在 UIPageViewController 中包含的 ViewController 的委托获得 nil

UIPageControl(页面控件)不显示在 UIPageViewController

如何在 UIPageViewController 和孩子之间正确传递对象