iphone - guidelines - Personalice el punto con la imagen de UIPageControl en el índice 0 de UIPageControl
navigation ios (8)
Soy un nuevo alumno de la programación de iOS. He intentado buscar con otro ejemplo y más preguntas en stackoverflow pero no es mi objetivo. Quiero establecer una imagen de punto en el índice 0 de UIPageControl similar a la pantalla de inicio de búsqueda de iPhone. ¿Tienes alguna forma de hacerlo? Por favor explícame con algún código u otro enlace útil.
Gracias por adelantado
Actualización para Swift 3.0 ... sabe si está de acuerdo con aceptar el riesgo declarado: "Modificar las subvistas de un control existente es frágil".
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
}
}
Creo que para esto necesitas personalizar todo UIPageControl
. Por favor, encuentre más en los siguientes enlaces
De la respuesta de iProgrammer
En caso de que quieras esconder el punto original.
- (UIImageView *)imageViewForSubview:(UIView *)view {
UIImageView * dot = nil;
[view setBackgroundColor:[UIColor clearColor]]; << add this line
He encontrado una solución para este problema. Sé que no es así, pero funcionará hasta que iOS 8 se lance al mercado.
Motivo del accidente:
en iOS 7 [self.subViews objectAtIndex: i] devuelve UIView en lugar de UIImageView y setImage no es propiedad de UIView y la aplicación se bloquea. Resuelvo mi problema usando el siguiente código.
Compruebe si la subvista es UIView (para iOS7) o UIImageView (para iOS6 o anterior). Y si es UIView, voy a agregar UIImageView como subvista en esa vista y ¡voilá su funcionamiento y no se cuelgue ...!
-(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;
}
Además, para borrar las imágenes que ya están allí, configure los colores de tinte para que los indicadores existentes sean transparentes:
- (void)awakeFromNib
{
self.pageIndicatorTintColor = [UIColor clearColor];
self.currentPageIndicatorTintColor = [UIColor clearColor];
}
Espero que esto resuelva tu problema para iOS 7.
Feliz codificacion
La mejor compilación del código para Swift 3 para reemplazar el primer icono de UIPageControl
por un marcador de ubicación:
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
}
}
Imágenes adjuntas:
Prueba este enlace: -
Responda con GrayPageControl: - ¿Hay alguna manera de cambiar el color de los puntos del indicador de página
Es realmente bueno y confiable. También he usado este código.
Es posible que tengas que hacer algo más de personalización como
-(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;
}
}
}
}
Simplemente cambie el indicador de la página UIPageControl self.pageControl.currentPageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"circle"]];
Solo necesitas hacerlo así:
((UIImageView *)[[yourPageControl subviews] objectAtIndex:0]).image=[UIImage imageNamed:@"search.png"];