在 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 上被调用
带有 Peeking 的 UIPageViewController
在 UIPageViewController 中包含的 ViewController 的委托获得 nil