UISegmentedControl dans l'image de séparation iOS 7 est incorrect pendant l'animation

J'ai un UISegmentedControl personnalisé. Dans iOS 6 et ci-dessous, cela fonctionne très bien. Sous iOS 7 .. il semble bien jusqu'à ce que j'appuie sur le contrôle, à quel moment, l'image de séparation semble bizarre pendant une fraction de seconde.

Voici mon code:

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 barMesortingcs:UIBarMesortingcsDefault]; [[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMesortingcs:UIBarMesortingcsDefault]; [[UISegmentedControl appearance] setBackgroundImage:segmentUnselected forState:UIControlStateHighlighted barMesortingcs:UIBarMesortingcsDefault]; [[UISegmentedControl appearance] setDividerImage:segUnselectedSelected forLeftSegmentState:UIControlStateNormal // | UIControlStateHighlighted rightSegmentState:UIControlStateSelected barMesortingcs:UIBarMesortingcsDefault]; [[UISegmentedControl appearance] setDividerImage:segUnselectedSelected forLeftSegmentState:UIControlStateHighlighted rightSegmentState:UIControlStateSelected barMesortingcs:UIBarMesortingcsDefault]; [[UISegmentedControl appearance] setDividerImage:segmentSelectedUnselected forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal //| UIControlStateHighlighted) barMesortingcs:UIBarMesortingcsDefault]; [[UISegmentedControl appearance] setDividerImage:segmentSelectedUnselected forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateHighlighted barMesortingcs:UIBarMesortingcsDefault]; UIFont *font = [UIFont systemFontOfSize:16.0f]; UIColor *textColor = [UIColor darkGrayColor]; NSDictionary *atsortingbutes = [NSDictionary dictionaryWithObjectsAndKeys: font, @"NSFontAtsortingbuteName", textColor, @"NSForegroundColorAtsortingbuteName", nil]; [[UISegmentedControl appearance] setTitleTextAtsortingbutes:atsortingbutes forState:UIControlStateNormal]; 

Des idées ce qui se passe quand j'appuie sur le UISegmentedControl qui pourrait faire que le diviseur soit mal affiché? Merci?

J'ai résolu ceci d'une manière similaire à ce que décrit l'user 21212193, mais au lieu d'append une cible pour l'événement de modification de valeur, j'ai sous-classé UISegmentedControl et ajouté ces deux methods:

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

Évidemment, ce n'est toujours pas une solution parfaite, en ce sens qu'elle repose sur les composants internes de UISegmentedControl, mais au less, elle gardera votre code un peu plus propre.

TL; DR Supprimez simplement toutes les animations de chaque segment. Voir le code ci-dessous

J'ai été capable de résoudre ce problème en supprimant les animations par défaut pour backgroundImage et les titres (UILabel) en appelant removeAllAnimations sur la couche du segment et en appelant également removeAllAnimations sur l'UILabel nested à l'intérieur de chaque segment. J'ai placé ce code dans la méthode IBAction qui est appelée lorsque l'événement UISegmentedControl valueChanged est déclenché.

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

Je n'ai pas testé cela sur un contenu qui est un UIImage mais je ne vois pas pourquoi cela ne marcherait pas tant que vous changiez cette ligne:

 [view isKindOfClass:[UILabel class] 

pour correspondre à la class UIImage comme ça:

 [view isKindOfClass:[UIImage class] 

Je connaissais un problème similaire et j'ai compris qu'il y a deux choses qui se passent. L'un d'entre eux que vous avez déjà traité (mise en place d'images pour les combos en surbrillance / sélectionnés). L'autre est que UISegmentedControl fait un surlignement de couleur lorsque vous select un nouveau segment comme UITableViewCells lorsque vous les select. Et, même si j'ai customisé tout l'art et le text, il est toujours en train de disparaître à une couleur sombre (mon text s'inverse même) et ensuite il revient. Au cours de ce fondu, les bords de mes séparateurs sont facilement visibles.

J'ai dû activer les animations lentes dans le simulateur pour voir cela plus clairement. Malheureusement, je n'ai pas réussi à find un moyen de désactiver ces animations par défaut.

Pour append un peu plus de détails à la réponse de Wyatt, ce qui se passe est que l'image "diviseur" et la nouvelle image "sélectionnée" sont changées instantanément sur touchUp, mais la transition du segment précédemment sélectionné de l'image "sélectionnée" à "non sélectionnée" "L'image est réalisée via un fondu enchaîné animé.

Si vous avez une grande image de "diviseur" avec un contraste élevé entre l'image "diviseur" et l'image "sélectionnée", cela conduit à un flash ennuyeux.

J'ai résolu cela en touchesEnded dans une sous-class et en désactivant les animations pour CATransaction

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

Essayez de définir la propriété tintcolor du contrôle de segment. J'ai eu ce problème. J'ai réglé la couleur de la teinte sur la couleur de sélection et aucune image n'a été définie pour le diviseur. Comme c'est l'IOS 7, vous pouvez le faire pour IOS 7 et garder le code de l'image de séparation pour l'IOS 6. Pour clarifier les choses, je parle de la propriété tintcolor instance level de UISegmentControl.