pautas interfaz humana human guidelines bars bar apple ios iphone cocoa-touch ios7 uisegmentedcontrol

interfaz - navigation button ios



El control UISegmentado en la imagen divisora de iOS 7 está mal durante la animación (6)

Tengo un UISegmentedControl personalizado. En iOS 6 y abajo funciona bien. Bajo iOS 7 ... se ve bien hasta que presiono el control, en ese momento, la imagen del divisor se ve rara por una fracción de segundo.

Aquí está mi código:

UIImage *segmentSelected = [[UIImage imageNamed:@"segcontrol_sel.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(6, 6, 6, 6)]; UIImage *segmentUnselected = [[UIImage imageNamed:@"segcontrol_unsel.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(6, 6, 6, 6)]; UIImage *segmentSelectedUnselected = [UIImage imageNamed:@"segcontrol_sel_uns.png"]; UIImage *segUnselectedSelected = [UIImage imageNamed:@"segcontrol_uns_sel.png"]; [[UISegmentedControl appearance] setBackgroundImage:segmentUnselected forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; [[UISegmentedControl appearance] setBackgroundImage:segmentUnselected forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; [[UISegmentedControl appearance] setDividerImage:segUnselectedSelected forLeftSegmentState:UIControlStateNormal // | UIControlStateHighlighted rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; [[UISegmentedControl appearance] setDividerImage:segUnselectedSelected forLeftSegmentState:UIControlStateHighlighted rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; [[UISegmentedControl appearance] setDividerImage:segmentSelectedUnselected forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal //| UIControlStateHighlighted) barMetrics:UIBarMetricsDefault]; [[UISegmentedControl appearance] setDividerImage:segmentSelectedUnselected forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; UIFont *font = [UIFont systemFontOfSize:16.0f]; UIColor *textColor = [UIColor darkGrayColor]; NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: font, @"NSFontAttributeName", textColor, @"NSForegroundColorAttributeName", nil]; [[UISegmentedControl appearance] setTitleTextAttributes:attributes forState:UIControlStateNormal];

¿Alguna idea de lo que está sucediendo cuando presiono el Control UISegmentado que podría causar que el divisor se muestre incorrectamente? ¿Gracias?


Estaba experimentando un problema similar y descubrí que hay dos cosas sucediendo. Uno de ellos ya lo has tratado (configuración de imágenes para los combos resaltados / seleccionados). La otra es que UISegmentedControl resalta el color cuando selecciona un nuevo segmento como lo hace UITableViewCells cuando los selecciona. Y, aunque he personalizado todo el arte y el texto, todavía se está desvaneciendo a un color oscuro (mi texto incluso se invierte) y luego vuelve. Durante ese desvanecimiento, los bordes de mis divisores se ven fácilmente.

Tuve que activar Animaciones lentas en el simulador para ver esto más claramente. Desafortunadamente, no he podido encontrar una manera de deshabilitar esas animaciones predeterminadas.


Intenta establecer la propiedad tintcolor del control de segmento. Tuve este problema Establecí el color del tinte al color de selección y no se configuró ninguna imagen para el divisor. Ya que esto es IOS 7, puede hacerlo para IOS 7 y mantener el código de imagen divisor para IOS 6. Para aclarar las cosas, estoy hablando de la propiedad de nivel de instancia tintcolor de UISegmentControl.


Para agregar un poco más de detalles a la respuesta de Wyatt, lo que está sucediendo es que la imagen del "divisor" y la nueva imagen "seleccionada" se cambian instantáneamente en el touchUp, pero la transición del segmento previamente seleccionado de la imagen "seleccionada" a la "no seleccionada" "la imagen se realiza a través de un crossfade animado.

Si tiene una imagen de "divisor" amplia con un alto contraste entre la imagen de "divisor" y la imagen "seleccionada", esto lleva a un destello molesto.


Resolví esto de una manera similar a lo que describe user2128193, pero en lugar de agregar un objetivo para el evento de cambio de valor, subclasificé UISegmentedControl y agregué estos dos métodos:

- (void)sendActionsForControlEvents:(UIControlEvents)controlEvents { [super sendActionsForControlEvents:controlEvents]; if (controlEvents & UIControlEventValueChanged) { [self removeAnimationsRecursivelyForView:self]; } } - (void)removeAnimationsRecursivelyForView:(UIView *)view { [view.layer removeAllAnimations]; for (UIView *subview in [view subviews]) { [self removeAnimationsRecursivelyForView:subview]; } }

Obviamente, esta todavía no es una solución perfecta, ya que se basa en los elementos internos de UISegmentedControl, pero al menos mantendrá su código un poco más limpio.


touchesEnded esto al anular los touchesEnded en una subclase y deshabilitando las animaciones para CATransaction

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) { CATransaction.setDisableActions(true) super.touchesEnded(touches, withEvent: event) }


TL; DR Simplemente elimina todas las animaciones en cada segmento. Vea el código abajo

He podido solucionar este problema eliminando las animaciones predeterminadas para la imagen de fondo y los títulos (UILabel) llamando a removeAllAnimations en la capa del segmento y también llamando a removeAllAnimations en la UILabel anidada dentro de cada segmento. Coloqué este código dentro del método IBAction que se llama cuando se dispara el evento UISegmentedControl valueChanged.

- (IBAction)tabSelected:(id)sender { UISegmentedControl *segmentedControl = (UISegmentedControl *)sender; for (UIView *segment in [segmentedControl subviews]) { [segment.layer removeAllAnimations]; for (UIView *view in [segment subviews]) { if ([view isKindOfClass:[UILabel class]]) { [view.layer removeAllAnimations]; } } } }

No he probado esto en el contenido que es un UIImage pero no veo ninguna razón por la que no funcionaría siempre y cuando cambies esta línea:

[view isKindOfClass:[UILabel class]

para que coincida con la clase UIImage así:

[view isKindOfClass:[UIImage class]