有没有办法改变页面指示点颜色

Posted

技术标签:

【中文标题】有没有办法改变页面指示点颜色【英文标题】:Is there a way to change page indicator dots color 【发布时间】:2010-08-04 19:57:29 【问题描述】:

我是 iphone 编程的新手,我正在尝试开发一个使用页面控制的应用程序。我的视图的背景颜色是白色,页面控制器默认也是白色的,这使得页面控件在我的视图中不可见,因此我更改了页面控件的背景颜色以使其可见。现在,该视图看起来已修补且很糟糕。有没有办法只更改页面控件的点颜色?

提前致谢

【问题讨论】:

重复问题。顺便说一句,看到这个***.com/questions/2942636/…,给定的解决方案是世界上最好的解决方案之一。我个人使用了很多次。 你可以参考这个帖子***.com/questions/26648988/… 【参考方案1】:

我们自定义 UIPageControl 以使用自定义图像作为页面指示器,我在下面列出了该类的内容...

GrayPageControl.h

@interface GrayPageControl : UIPageControl

    UIImage* activeImage;
    UIImage* inactiveImage;

GrayPageControl.m

-(id) initWithCoder:(NSCoder *)aDecoder

    self = [super initWithCoder:aDecoder];

    activeImage = [[UIImage imageNamed:@"active_page_image.png"] retain];
    inactiveImage = [[UIImage imageNamed:@"inactive_page_image.png"] retain];

    return self;


-(void) updateDots

    for (int i = 0; i < [self.subviews count]; i++)
    
        UIImageView* dot = [self.subviews objectAtIndex:i];
        if (i == self.currentPage) dot.image = activeImage;
        else dot.image = inactiveImage;
    


-(void) setCurrentPage:(NSInteger)page

    [super setCurrentPage:page];
    [self updateDots];

然后在 View Controller 中我们就像普通的 UIPageControl 一样使用它

IBOutlet GrayPageControl* PageIndicator;

编辑:

在具有 GrayPageControl 的视图控制器中,我有一个链接到 GrayPageControl.ValueChanged 事件的 IBAction。

-(IBAction) pageChanged:(id)sender

    int page = PageIndicator.currentPage;

    // update the scroll view to the appropriate page
    CGRect frame = ImagesScroller.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    [ImagesScroller scrollRectToVisible:frame animated:YES];

【讨论】:

我还为 layoutSubviews 添加了一个覆盖,它刚刚调用了 updateDots - 它在首次添加控件时消除了轻微的闪烁 :) 我解决了这个问题:dot.frame = CGRectMake(dot.frame.origin.x, dot.frame.origin.y, 20., 20.);谢谢你,你的代码很简单,但很棒! -(void) setCurrentPage:(NSInteger)page 在我点击按钮时没有被调用。 只是让您知道,这在 ios7(使用 Xcode 5 编译)上会崩溃,因为 UIPageControl 子视图不再是 UIImageViews。 在 ios 7 中不起作用。给出异常“无法识别的选择器”,因为 [self.subviews objectAtIndex:i] 返回 UIView 而不是 UIImageview,并且图像不是 UIView 的属性。请检查并为我的[这里的问题]提供一些解决方案(***.com/questions/19024167/…【参考方案2】:

应用程序在 iOS7 中崩溃。我有一个适用于 iOS 7 的解决方案:

崩溃原因:

在 iOS 7 中 [self.subViews objectAtIndex: i] 返回 UIView 而不是 UIImageViewsetImage 不是 UIView 的属性并且应用程序崩溃。我使用以下代码解决了我的问题。

检查子视图是UIView(适用于iOS7)还是UIImageView(适用于iOS6或更早版本)。如果是UIView,我将在该视图上添加UIImageView 作为子视图,瞧它的工作原理,不会崩溃..!!

-(void) updateDots

    for (int i = 0; i < [self.subviews count]; i++)
    
        UIImageView * dot = [self imageViewForSubview:  [self.subviews objectAtIndex: i]];
        if (i == self.currentPage) dot.image = activeImage;
        else dot.image = inactiveImage;
    

 - (UIImageView *) imageViewForSubview: (UIView *) view

    UIImageView * dot = nil;
    if ([view isKindOfClass: [UIView class]])
    
        for (UIView* subview in view.subviews)
        
            if ([subview isKindOfClass:[UIImageView class]])
            
                dot = (UIImageView *)subview;
                break;
            
        
        if (dot == nil)
        
            dot = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, view.frame.size.width, view.frame.size.height)];
            [view addSubview:dot];
        
    
    else
    
        dot = (UIImageView *) view;
    

    return dot;

希望这也能解决 iOS7 的问题。如果 Anypone 找到了最佳解决方案,请发表评论。 :)

愉快的编码

【讨论】:

如果你不想要背景上的白色圆角颜色,只需添加 view.backgroundColor = [UIColor clearColor];在 imageViewForSubview 方法的开头。【参考方案3】:

JWD 答案是要走的路。但是,如果您只想更改颜色,为什么不这样做:

此技术仅适用于 iOS6.0 及更高版本!

选择你的 UIPageControl 去属性检查器。多田。

或者您也可以使用以下 2 个属性:

  pageIndicatorTintColor  property
  currentPageIndicatorTintColor  property

这很简单。我再次阅读了这个问题,以确保我没有错。你真的只是想改变颜色,不是吗?好的。

你仍然被那些法律点所困扰。使用 JWD 技术制作精美的点图。

【讨论】:

我不想吹嘘。虽然 JWD 的答案非常好,但我是唯一一个真正回答这个问题的人:D 如果我想在 iOS 5 中做同样的事情,我会怎么做? 我按照 appcoda 教程在我的应用程序中构建 uipageview 控制器。我没有找到您上面提到的任何控件。这些控件在 x 代码 6 中仍然可用吗?如果有请帮我提供一些细节。喜欢将所选页面的点更改为蓝色,将其他点更改为后点-提前感谢【参考方案4】:

只需一行代码即可满足您的需求。示例设置为黑色。

pageControl.pageIndicatorTintColor = [UIColor blackColor];

【讨论】:

【参考方案5】:

DDPageControl 是一个很好的替代品。看看吧!

您也可以查看已归档的博文here。

【讨论】:

谢谢,我解决了这个问题。【参考方案6】:

您可以使用以下代码更改页面指示器色调和当前页面指示器色调:

pageControl.pageIndicatorTintColor = [UIColor orangeColor];
pageControl.currentPageIndicatorTintColor = [UIColor blackColor];

【讨论】:

【参考方案7】:

如果您只是想更改点的颜色或对其进行自定义,您可以按照 JWD 的建议进行制作,但可以采用另一种方式:

#pragma mark - LifeCycle

- (void)setCurrentPage:(NSInteger)page

    [super setCurrentPage:page];
    [self updateDots];


#pragma mark - Private

- (void)updateDots

    for (int i = 0; i < [self.subviews count]; i++) 
        UIView* dot = [self.subviews objectAtIndex:i];
        if (i == self.currentPage) 
            dot.backgroundColor = UIColorFromHEX(0x72E7DB);
            dot.layer.cornerRadius = dot.frame.size.height / 2;
         else 
            dot.backgroundColor = UIColorFromHEX(0xFFFFFF);
            dot.layer.cornerRadius = dot.frame.size.height / 2 - 1;
            dot.layer.borderColor = UIColorFromHEX(0x72E7DB).CGColor;
            dot.layer.borderWidth = 1;
        
    

结果你会得到类似的东西

还有宏:

#define UIColorFromHEX(hexValue) [UIColor colorWithRed:((float)((hexValue & 0xFF0000) >> 16))/255.0 green:((float)((hexValue & 0xFF00) >> 8))/255.0 blue:((float)(hexValue & 0xFF))/255.0 alpha:1.0]

【讨论】:

要正常工作,您必须禁用用户交互。否则有故障!【参考方案8】:

最好和最简单的方法是在 AppDelegate.m 的 didFinishLaunchingWithOptions 方法中添加以下代码行

UIPageControl *pageControl = [UIPageControl appearance];
pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
pageControl.backgroundColor = [UIColor whiteColor];

【讨论】:

【参考方案9】:

您可能想在另一个*** question 中查看this solution。

【讨论】:

【参考方案10】:

这是使用自定义图像的相关答案(如果您很灵活并且可以使用图像而不是直接更改颜色)。

Customize dot with image of UIPageControl at index 0 of UIPageControl

【讨论】:

以上是关于有没有办法改变页面指示点颜色的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法改变按钮后面的背景颜色(button.setBackgroundResource)

Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色

更改 UIPickerView 选择指示器的颜色

(Tailwind - DaisyUI) 有没有办法改变下拉项目的悬停和活动颜色?

如何使百分比指示器以编程方式在颤动中改变颜色?

如何更改新的 TabLayout 指示器颜色和高度