UIPageControl 点边框颜色

Posted

技术标签:

【中文标题】UIPageControl 点边框颜色【英文标题】:UIPageControl dot border color 【发布时间】:2020-08-06 18:08:38 【问题描述】:

我无法在 ios 14 中设置页面控制点的边框颜色。以下代码适用于 iOS

for (int i = 0; i < [self.subViews count]; i++) 
    UIView *dot = [self.subViews objectAtIndex:i];
    dot.layer.borderWidth = 1;
    dot.layer.borderColor = [UIColor blueColor].CGColor;

UIPageControl 色调颜色清晰。我只想添加边框。需要在 Obj-C 中解决这个问题。

【问题讨论】:

【参考方案1】:

评论

iOS 14 仍处于测试阶段,任何基于视图层次结构的解决方案都可能停止使用下一个测试版本。 它还可以在任何未来的 iOS 版本(非测试版)中停止工作。 您依赖于私有视图层次结构。 Apple 可以随时更改它,无需另行通知。 IOW 它属于私有 API 使用类别 = 你自己在这里。

UIPageControl 视图层次结构

iOS 13

iOS 14

新 API

即使您更新代码以匹配新的视图层次结构...

UIView *pageControlContentView = self.pageControl.subviews[0];
UIView *pageControlIndicatorContentView = pageControlContentView.subviews[0];
[pageControlIndicatorContentView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) 
    obj.layer.borderWidth = 1;
    obj.layer.borderColor = UIColor.blueColor.CGColor;
];

...你会得到这样的东西:

iOS 14 引入了您可以使用的新属性和方法:

preferredIndicatorImage setIndicatorImage(_:forPage:) indicatorImageForPage:

您可以使用 SF Symbols 例如:

UIImage *image = [UIImage systemImageNamed:@"link.circle.fill"];
self.pageControl.preferredIndicatorImage = image;

然后你会得到:

换句话说,为了安全起见,避免私有视图层次结构,使用preferredIndicatorImage。如果您想自定义图像等,您可以准备自己的图像。但这是另一个问题的主题。如果您想以编程方式进行,请搜索问题like this one。

由于您使用的是私有视图层次结构,因此请学习您的工具 (Xcode) 并从 Examining the View Hierarchy 和 Debugging View Hierarchies 章节开始。下次你会发现自己有什么问题。

【讨论】:

【参考方案2】:

嗯,我只发现这个像“解决方案”

之前(

之后(iOS 14):

if #available(iOS 14.0, *) 
            pageControl.currentPageIndicatorTintColor = .blue // custom color
            pageControl.pageIndicatorTintColor = .blue.withAlphaComponent(0.3)
         else 
            // Fallback on earlier versions
            for index: Int in 0...3 
                guard pageControl.subviews.count > index else  return 
                let dot: UIView = pageControl.subviews[index]
                dot.layer.cornerRadius = dot.frame.size.height / 2
                if index == pageControl.currentPage 
                    dot.backgroundColor = .blue                        
                    dot.layer.borderWidth = 0
                 else 
                    dot.backgroundColor = UIColor.clear
                    dot.layer.borderColor = UIColor.blue.cgColor
                    dot.layer.borderWidth = 1
                
            

【讨论】:

【参考方案3】:

iOS 14 允许使用 SFSymbol 设置指示器图像,因此您可以使用 circle.fill 和简单的圆形符号作为点。

func updateBorderColor() 
if #available(iOS 14.0, *) 
    let smallConfiguration = UIImage.SymbolConfiguration(pointSize: 8.0, weight: .bold)
    let circleFill = UIImage(systemName: "circle.fill", withConfiguration: smallConfiguration)
    let circle = UIImage(systemName: "circle", withConfiguration: smallConfiguration)
    for index in 0..<numberOfPages 
        if index == currentPage 
            setIndicatorImage(circleFill, forPage: index)
         else 
            setIndicatorImage(circle, forPage: index)
        
    
    pageIndicatorTintColor = selectionColor
     else 
    subviews.enumerated().forEach  index, subview in
        if index != currentPage 
            subview.layer.borderColor = selectionColor.cgColor
            subview.layer.borderWidth = 1
         else 
            subview.layer.borderWidth = 0
        
    

【讨论】:

以上是关于UIPageControl 点边框颜色的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 4 UIPage 控件:如何更改页面控件的高度?

如何更改 UIPageControl 点的边框?

Swift UIPageControl 不显示点

基于 iOS 页面的模板,关于点的 UIPageViewController 和 UIPageControl 颜色

如何用每页不同的颜色更改 UIPageControl 中分页点的颜色

使用UIScrollView和UIPageControl做一个能够用手势来切换图片的效果