31

私はiosプログラミングの新しい学習者です。stackoverflow で別の例とその他の質問を検索しようとしましたが、それは私の目標ではありません。UIPageControl のインデックス 0 に、iPhone の検索ホーム画面と同じようにドットの画像を設定したいと考えています。それを行う方法はありますか?いくつかのコードまたは別の便利なリンクで説明してください。

前もって感謝します

ここに画像の説明を入力

4

11 に答える 11

34

この問題の解決策を見つけました。そうではないことはわかっていますが、iOS 8 が市場に投入されるまでは機能します。

クラッシュの理由:

iOS 7 では [self.subViews objectAtIndex: i] は UIImageView の代わりに UIView を返し、setImage は 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;
}

また、既に存在する画像をクリアするには、既存のインジケーターの色合いを透明に設定します。

- (void)awakeFromNib
{   
    self.pageIndicatorTintColor = [UIColor clearColor];
    self.currentPageIndicatorTintColor = [UIColor clearColor];
}

これで iOS 7 の問題が解決することを願っています。

ハッピーコーディング

于 2013-10-03T07:19:33.887 に答える
15

このリンクを試してください:-

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

それは本当に良くて信頼できます。私もこのコードを使用しました。

次のように、さらにカスタマイズする必要があるかもしれません

-(void) updateDots
{
    for (int i = 0; i < [self.subviews count]; i++)
    {
        UIImageView* dot = [self.subviews objectAtIndex:i];

        if (i == self.currentPage) {
            if(i==0) {
                dot.image = [UIImage imageNamed:@"activesearch.png"];
            } else {
                dot.image = activeImage;
            }        
        } else {
            if(i==0) {
                dot.image = [UIImage imageNamed:@"inactivesearch.png"];
            } else {
                dot.image = inactiveImage;
            }
        }
    }
}
于 2012-08-30T05:42:13.293 に答える
10

UIPageControl ページインジケーターの色をパターン画像で変更するだけですself.pageControl.currentPageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"circle"]];

于 2015-08-18T09:10:20.793 に答える
9

Swift 3 の最初のアイコンを場所マーカーに置き換えるためのコードの最適なコンパイル:UIPageControl

import UIKit

class LocationPageControl: UIPageControl {

    let locationArrow: UIImage = UIImage(named: "locationArrow")!
    let pageCircle: UIImage = UIImage(named: "pageCircle")!

    override var numberOfPages: Int {
        didSet {
            updateDots()
        }
    }

    override var currentPage: Int {
        didSet {
            updateDots()
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        self.pageIndicatorTintColor = UIColor.clear
        self.currentPageIndicatorTintColor = UIColor.clear
        self.clipsToBounds = false
    }

    func updateDots() {
        var i = 0
        for view in self.subviews {
            var imageView = self.imageView(forSubview: view)
            if imageView == nil {
                if i == 0 {
                    imageView = UIImageView(image: locationArrow)
                } else {
                    imageView = UIImageView(image: pageCircle)
                }
                imageView!.center = view.center
                view.addSubview(imageView!)
                view.clipsToBounds = false
            }
            if i == self.currentPage {
                imageView!.alpha = 1.0
            } else {
                imageView!.alpha = 0.5
            }
            i += 1
        }
    }

    fileprivate func imageView(forSubview view: UIView) -> UIImageView? {
        var dot: UIImageView?
        if let dotImageView = view as? UIImageView {
            dot = dotImageView
        } else {
            for foundView in view.subviews {
                if let imageView = foundView as? UIImageView {
                    dot = imageView
                    break
                }
            }
        }
        return dot
    }
}

添付画像:

ここに画像の説明を入力 ここに画像の説明を入力

于 2016-12-14T07:19:52.847 に答える
8

UIPageControl の内部をハッキングしたり、1 つの小さなウィジェット用のライブラリ全体を使用したりすることなく、ほとんど同じように機能するカスタム ページ コントローラーを作成しました。

空の UIStackView をストーリーボードに配置し、そのカスタム クラスをこのクラスの下に作成し、通常の UIPageControlnumberOfPagesと同じように使用します。currentPageUIStackView の間隔を設定して、ビュー間のスペースを変更します。

スウィフト 4.2

/**
 If adding via storyboard, you should not need to set a width and height constraint for this view,
 just set a placeholder for each so autolayout doesnt complain and this view will size itself once its populated with pages at runtime
 */
class PageControl: UIStackView {

    @IBInspectable var currentPageImage: UIImage = UIImage(named: "whiteCircleFilled")!
    @IBInspectable var pageImage: UIImage = UIImage(named: "whiteCircleOutlined")!
    /**
     Sets how many page indicators will show
     */
    var numberOfPages = 3 {
        didSet {
            layoutIndicators()
        }
    }
    /**
     Sets which page indicator will be highlighted with the **currentPageImage**
     */
    var currentPage = 0 {
        didSet {
            setCurrentPageIndicator()
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()

        axis = .horizontal
        distribution = .equalSpacing
        alignment = .center

        layoutIndicators()
    }

    private func layoutIndicators() {

        for i in 0..<numberOfPages {

            let imageView: UIImageView

            if i < arrangedSubviews.count {
                imageView = arrangedSubviews[i] as! UIImageView // reuse subview if possible
            } else {
                imageView = UIImageView()
                addArrangedSubview(imageView)
            }

            if i == currentPage {
                imageView.image = currentPageImage
            } else {
                imageView.image = pageImage
            }
        }

        // remove excess subviews if any
        let subviewCount = arrangedSubviews.count
        if numberOfPages < subviewCount {
            for _ in numberOfPages..<subviewCount {
                arrangedSubviews.last?.removeFromSuperview()
            }
        }
    }

    private func setCurrentPageIndicator() {

        for i in 0..<arrangedSubviews.count {

            let imageView = arrangedSubviews[i] as! UIImageView

            if i == currentPage {
                imageView.image = currentPageImage
            } else {
                imageView.image = pageImage
            }
        }
    }
}

私の目的のために動作しますが、私は保証しません

于 2018-12-20T12:22:36.250 に答える
4

Swift 3.0 の更新 ... 「既存のコントロールのサブビューを変更することは脆弱です」という記載されたリスクを受け入れることに問題がないかどうかはわかります。

 import UIKit

 class CustomImagePageControl: UIPageControl {

   let activeImage:UIImage = UIImage(named: "SelectedPage")!
   let inactiveImage:UIImage = UIImage(named: "UnselectedPage")!

   override func awakeFromNib() {
         super.awakeFromNib()

         self.pageIndicatorTintColor = UIColor.clear
         self.currentPageIndicatorTintColor = UIColor.clear
         self.clipsToBounds = false
    }

    func updateDots() {
         var i = 0
         for view in self.subviews {
             if let imageView = self.imageForSubview(view) {
                 if i == self.currentPage {
                     imageView.image = self.activeImage
                 } else {
                     imageView.image = self.inactiveImage
                 }
                 i = i + 1
             } else {
                 var dotImage = self.inactiveImage
                 if i == self.currentPage {
                     dotImage = self.activeImage
                 }
                 view.clipsToBounds = false
                 view.addSubview(UIImageView(image:dotImage))
                 i = i + 1
             }
         }
     }

     fileprivate func imageForSubview(_ view:UIView) -> UIImageView? {
         var dot:UIImageView?

         if let dotImageView = view as? UIImageView {
             dot = dotImageView
         } else {
             for foundView in view.subviews {
                 if let imageView = foundView as? UIImageView {
                     dot = imageView
                     break
                 }
             }
         }

         return dot
     }
 }
于 2016-12-02T18:07:13.927 に答える
2

次のようにするだけです。

((UIImageView *)[[yourPageControl subviews] objectAtIndex:0]).image=[UIImage imageNamed:@"search.png"];
于 2012-08-30T05:18:01.930 に答える
1

これには全体をカスタマイズする必要があると思いますUIPageControl。以下のリンクで詳細をご覧ください

  1. UIPageControlのページネーションドットの色を変更するにはどうすればよいですか?

  2. http://iphoneappcode.blogspot.in/2012/03/custom-uipagecontrol.html

于 2012-08-30T05:06:06.663 に答える
0

iOS 14 以降では、次のメソッドを使用してインジケーター イメージを取得および設定できます。

@available(iOS 14.0, *)
open func indicatorImage(forPage page: Int) -> UIImage?


@available(iOS 14.0, *)
open func setIndicatorImage(_ image: UIImage?, forPage page: Int)
于 2021-06-15T20:04:24.683 に答える