web-dev-qa-db-ja.com

ページインジケータのドットの色を変更する方法はありますか

私はiPhoneプログラミングの初心者で、ページコントロールを使用するアプリを開発しようとしています。ビューの背景色は白で、ページコントローラーのデフォルトの色も白です。これにより、ビュー上でページコントロールが非表示になるため、ページコントロールの背景色を変更して表示します。現在、ビューにはパッチが適用されており、不良です。ページ制御のためにドットの色だけを変更する方法はありますか?

前もって感謝します

28

ページインジケーターにカスタムイメージを使用するように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があるView Controllerには、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];
}
52
JWD

IOS7でアプリケーションがクラッシュします。 iOS 7のソリューションがあります:

クラッシュの理由:

iOS 7 [self.subViews objectAtIndex: i]UIViewの代わりにUIImageViewを返し、setImageUIViewのプロパティではなく、アプリがクラッシュします。次のコードを使用して問題を解決します。

サブビューが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のur問題も解決することを願っています。 Anyponeがそのための最適なソリューションを見つけた場合はコメントしてください。 :)

ハッピーコーディング

18
iProgrammer

JWDの答えが道です。ただし、色を変更するだけでよい場合は、これを行わないでください:

この手法はiOS6.0以降でのみ動作します!

enter image description here

UIPageControlを選択して、属性インスペクターに移動します。多田。

または、次の2つのプロパティを試すこともできます。

  pageIndicatorTintColor  property
  currentPageIndicatorTintColor  property

これはとても簡単です。質問をもう一度読んで、間違いではないことを確認します。あなたは本当に色を変えたいだけですよね?それからはい。

あなたはまだその法的な点にこだわっています。素晴らしいドット画像にJWDテクニックを使用します。

15
Anonymous White

必要なコードは1行だけです。例は黒色に設定されています。

pageControl.pageIndicatorTintColor = [UIColor blackColor];
7
jianpx

DDPageControl は、優れた代替品です。見てみな!

アーカイブされたブログ投稿を表示することもできます here

5
raidfive

次のコードを使用して、ページインジケーターの色合いと現在のページインジケーターの色合いを変更できます。

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

ドットの色を変更したり、カスタマイズしたい場合は、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]
3
gbk

これを行うための最良かつ最も簡単な方法は、AppDelegate.mのdidFinishLaunchingWithOptionsメソッドに次のコード行を追加することです。

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

別の stackoverflow questionこの解決策 を見てみたいかもしれません。

1
Kai Huppmann

カスタムイメージを使用する場合の関連する回答を次に示します(柔軟性があり、色を直接変更するのではなくイメージを使用できる場合)。

IPageControlのインデックス0にあるUIPageControlの画像でドットをカスタマイズ

1
CodenameDuchess