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

时间:2010-08-04 19:57:29

标签: iphone colors uipagecontrol

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

提前致谢

10 个答案:

答案 0 :(得分:51)

我们定制了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];
}

答案 1 :(得分:17)

应用程序在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找到最佳解决方案,请发表评论。 :)

快乐编码

答案 2 :(得分:15)

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

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

enter image description here

选择您的UIPageControl转到属性检查器。多田。

或者你也可以玩这两个属性:

  pageIndicatorTintColor  property
  currentPageIndicatorTintColor  property

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

你仍然坚持那些法律点。使用JWD技术制作精美的点图片。

答案 3 :(得分:7)

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

pageControl.pageIndicatorTintColor = [UIColor blackColor];

答案 4 :(得分:5)

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

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

答案 5 :(得分:4)

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

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

答案 6 :(得分:3)

如果您只想更改点的颜色或自定义它,您可以按照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;
        }
    }
}

结果你会得到像

这样的东西

enter image description here

还有宏:

#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]

答案 7 :(得分:2)

执行此操作的最佳和最常用的方法是在AppDelegate.m中的didFinishLaunchingWithOptions方法中添加以下代码行

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

答案 8 :(得分:1)

您可能希望查看另一个this solution中的stackoverflow question

答案 9 :(得分:1)

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

Customize dot with image of UIPageControl at index 0 of UIPageControl