28

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

前もって感謝します

4

10 に答える 10

52

ページ インジケーターにカスタム イメージを使用するように 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];
}
于 2010-08-04T21:09:21.113 に答える
18

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

クラッシュの理由:

iOS 7では、代わりにand is not the property を[self.subViews objectAtIndex: i]返し、アプリがクラッシュします。この次のコードを使用して問題を解決します。UIViewUIImageViewsetImageUIView

サブビューが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の問題も解決されることを願っています。誰かがそのための最適な解決策を見つけたら、コメントしてください. :)

ハッピーコーディング

于 2013-10-01T06:09:06.300 に答える
15

JWDの答えが道です。ただし、色を変更するだけの場合は、次のようにしてください。

このテクニックは、iOS6.0 以降でのみ機能します。

ここに画像の説明を入力

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

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

  pageIndicatorTintColor  property
  currentPageIndicatorTintColor  property

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

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

于 2012-10-17T16:55:09.637 に答える
7

たった 1 行のコードで、あなたの要求に応えます。黒色に設定した例。

pageControl.pageIndicatorTintColor = [UIColor blackColor];
于 2013-07-11T07:45:52.830 に答える
5

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

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

于 2011-11-25T20:16:09.610 に答える
4

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

pageControl.pageIndicatorTintColor = [UIColor orangeColor];
pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
于 2015-11-04T15:21:10.440 に答える
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;
        }
    }
}

その結果、次のようなものが得られます

ここに画像の説明を入力

また、マクロ:

#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]
于 2015-02-26T12:08:01.053 に答える
2

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

UIPageControl *pageControl = [UIPageControl appearance];
pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
pageControl.backgroundColor = [UIColor whiteColor];
于 2016-05-04T10:58:55.800 に答える
1

別のstackoverflowの質問で、このソリューションを確認することをお勧めします。

于 2010-12-03T16:36:42.390 に答える
1

カスタム画像を使用するための関連する回答を次に示します(柔軟で、色を直接変更するのではなく画像を使用できる場合)。

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

于 2016-12-02T18:08:49.967 に答える