Les deux réponses ci-dessus ont été très utiles, mais j'ai un UIPickerView niché dans un UIScrollView. Je fais également un rendu continu ailleurs à l'écran lorsque l'interface graphique est présente. Le problème est que UIPickerView ne se met pas à jour complètement lorsque: une ligne non sélectionnée est tapée, le sélecteur est déplacé de sorte que deux lignes chevauchent la zone de sélection, ou une ligne est glissée mais le doigt glisse hors de l'UIPickerView. Ensuite, ce n'est que lorsque UIScrollView est déplacé que le sélecteur est mis à jour instantanément. Ce résultat est moche.
La cause du problème: mon rendu continu empêchait l'animation de UIPickerView d'obtenir les cycles de l'unité centrale nécessaires pour terminer, donc d'afficher la sélection correcte en cours. Ma solution - qui fonctionne - était la suivante: dans le touchesEnded:withEvent:
de UIPickerView, exécutez quelque chose pour mettre en pause mon rendu pendant un moment. Voici le code:
#import "SubUIPickerView.h"
@implementation SubUIPickerView
- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
[pickerTable touchesBegan:touches withEvent:event];
}
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
[pickerTable touchesMoved:touches withEvent:event];
}
- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
[singleton set_secondsPauseRendering:0.5f]; // <-- my code to pause rendering
[pickerTable touchesEnded:touches withEvent:event];
}
- (void) touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
{
[pickerTable touchesCancelled:touches withEvent:event];
}
- (UIView*) hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
if (CGRectContainsPoint(self.bounds, point))
{
if (pickerTable == nil)
{
int nSubviews = self.subviews.count;
for (int i = 0; i < nSubviews; ++i)
{
UIView* view = (UIView*) [self.subviews objectAtIndex:i];
if ([view isKindOfClass:NSClassFromString(@"UIPickerTable")])
{
pickerTable = (UIPickerTable*) view;
break;
}
}
}
return self; // i.e., *WE* will respond to the hit and pass it to UIPickerTable, above.
}
return [super hitTest:point withEvent:event];
}
@end
et l'en-tête, SubUIPickerView.h:
@class UIPickerTable;
@interface SubUIPickerView : UIPickerView
{
UIPickerTable* pickerTable;
}
@end
Comme je l'ai dit, cela fonctionne.Le rendu se met en pause pendant une seconde supplémentaire (il s'arrête déjà lorsque vous faites glisser UIScrollView), ce qui permet à l'animation UIPickerView de se terminer. L'utilisation de NSClassFromString() signifie que vous n'utilisez aucune API non documentée. Messing avec la chaîne Responder n'était pas nécessaire. Merci à checcco et à Tylerc230 pour m'avoir aidé à trouver ma propre solution!
merci :) ça a marché – ArunGJ
ce code semble fonctionner, sauf si une touche se produit sur le cadre qui entoure immédiatement la roue de sélecteur. faire cela semble provoquer une boucle infinie d'appels à la méthode getNextResponderView: withEvent:. – pistachionut
ya je l'ai empêché en renvoyant nil au lieu de hitTestView de getNextResponderView: withEvent: si j'ai touché la roue environnante. – ArunGJ