web-dev-qa-db-fra.com

Personnaliser le point avec l'image de UIPageControl à l'index de UIPageControl

Je suis un nouvel apprenant de la programmation iOS. J'ai essayé de chercher un autre exemple et plus de questions chez stackoverflow mais ce n'est pas mon objectif. Je veux définir une image de point à l'indice 0 de UIPageControl aussi semblable à l'écran de recherche iPhone. Avez-vous un moyen de le faire? Veuillez m'expliquer avec un code ou un autre lien utile.

Merci d'avance

enter image description here

26
Sovannarith

Essayez ce lien: -

Réponse avec GrayPageControl: - Existe-t-il un moyen de changer la couleur des points indicateurs de page

C'est vraiment bon et fiable.J'ai aussi utilisé ce code.

Vous devrez peut-être personnaliser davantage 

-(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;
            }
        }
    }
}
12
Gypsa

J'ai trouvé une solution à ce problème. Je sais que ce n'est pas le cas, mais cela fonctionnera jusqu'à ce qu'iOS 8 soit lancé sur le marché.

Raison de l'accident:

dans iOS 7 [self.subViews objectAtIndex: i] renvoie UIView au lieu de UIImageView et setImage n'est pas la propriété de UIView et l'application se bloque. Je résous mon problème en utilisant le code suivant.

Vérifiez si la sous-vue est UIView (pour iOS7) ou UIImageView (pour iOS6 ou une version antérieure). Et si c’est UIView, je vais ajouter UIImageView en tant que sous-vue sur cette vue et le tour est joué - et pas son plantage .. !!

-(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;
}

De plus, pour effacer les images déjà présentes, définissez les couleurs de teinte des indicateurs existants sur Transparent:

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

J'espère que cela résoudra votre problème pour iOS 7.

Bonne codage

34
iProgrammer

Changez simplement l'indicateur de page UIPageControl Couleur avec motif Image self.pageControl.currentPageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"circle"]]; 

10
Kiran Patil

La meilleure compilation du code pour Swift 3 pour remplacer la première icône de UIPageControl par un marqueur de lieu:

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
    }
}

Images attachées:

 enter image description here  enter image description here

9
Dmitry

Mise à jour pour Swift 3.0 ... vous savez si vous acceptez le risque déclaré: "La modification des sous-vues d'un contrôle existant est fragile".

 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
     }
 }
4
CodenameDuchess

Vous avez juste besoin de le faire comme ça:

((UIImageView *)[[yourPageControl subviews] objectAtIndex:0]).image=[UIImage imageNamed:@"search.png"];
2
Jonas

Je pense que pour cela, vous devez personnaliser UIPageControl entière. En savoir plus sur les liens ci-dessous

  1. Comment puis-je changer la couleur des points de pagination de UIPageControl?

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

1
BornCoder

J'ai créé un contrôleur de page personnalisé qui devrait fonctionner essentiellement de la même manière, sans pirater les éléments internes d'un UIPageControl ni disposer d'une bibliothèque complète pour un petit widget.

Il suffit de placer un UIStackView vide dans votre storyboard et d'en faire sa classe personnalisée ci-dessous, et d'utiliser numberOfPages et currentPage comme un UIPageControl normal. Définissez l’espacement sur UIStackView pour modifier l’espace disponible entre les vues.

Swift 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
            }
        }
    }
}

Fonctionne pour mes besoins mais je ne donne aucune garantie

1
Fonix

De la réponse de iProgrammer
Au cas où vous voudriez cacher le point original

- (UIImageView *)imageViewForSubview:(UIView *)view {
    UIImageView * dot = nil;
    [view setBackgroundColor:[UIColor clearColor]]; << add this line
0
saranpol