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
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;
}
}
}
}
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
Changez simplement l'indicateur de page UIPageControl Couleur avec motif Image self.pageControl.currentPageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"circle"]];
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:
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
}
}
Vous avez juste besoin de le faire comme ça:
((UIImageView *)[[yourPageControl subviews] objectAtIndex:0]).image=[UIImage imageNamed:@"search.png"];
Je pense que pour cela, vous devez personnaliser UIPageControl
entière. En savoir plus sur les liens ci-dessous
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
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