2010-02-16 18 views
2

Comment ajouter des événements gestuels à uipickerview pour changer d'onglet? Je dois créer une classe personnalisée, cependant, je ne sais pas comment gérer le uipickerview. J'ai actuellement des gestes présents dans uiviews pour le faire, mais j'ai des problèmes avec le uipickerview.iPhone Gestes UIPickerView

Mon code pour les vues:

#define HORIZ_SWIPE_DRAG_MIN 100 
CGPoint mystartTouchPosition; 
BOOL isProcessingListMove; 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint newTouchPosition = [touch locationInView:self.view]; 
    if(mystartTouchPosition.x != newTouchPosition.x || mystartTouchPosition.y != newTouchPosition.y) { 
     isProcessingListMove = NO; 
    } 
    mystartTouchPosition = [touch locationInView:self.view]; 
    [super touchesBegan:touches withEvent:event]; 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = touches.anyObject; 
    CGPoint currentTouchPosition = [touch locationInView:self.view]; 

    // If the swipe tracks correctly. 
    double diffx = mystartTouchPosition.x - currentTouchPosition.x + 0.1; // adding 0.1 to avoid division by zero 
    double diffy = mystartTouchPosition.y - currentTouchPosition.y + 0.1; // adding 0.1 to avoid division by zero 

    if(abs(diffx/diffy) > 2.5 && abs(diffx) > HORIZ_SWIPE_DRAG_MIN) 
    { 
     // It appears to be a swipe. 
     if(isProcessingListMove) { 
      // ignore move, we're currently processing the swipe 
      return; 
     } 

     if (mystartTouchPosition.x < currentTouchPosition.x) { 
      isProcessingListMove = YES; 
      self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:0]; 
      return; 
     } 
     else { 
      isProcessingListMove = YES; 

      self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:2]; 

      return; 
     } 
    } 
    else if(abs(diffy/diffx) > 1) 
    { 
     isProcessingListMove = YES; 
     [super touchesMoved:touches withEvent:event]; 
    } 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    isProcessingListMove = NO; 
    [super touchesEnded:touches withEvent:event]; 
} 

Merci pour l'aide.

+0

Vous pourriez vouloir clarifier exactement ce que vous essayez de faire. Essayez-vous de basculer les onglets de l'onglet UITabbar avec un geste de glissement coincé par l'UIPickerView? Essayez-vous de manipuler le UIPickerView lui-même en utilisant un balayage? – TechZen

Répondre

0

Vous ne pouvez pas sous-classer UIPickerView.

Toutefois, comme une vue de sélecteur doit être affichée dans une autre vue (puisqu'elle n'occupe pas tout l'écran), vous pouvez intercepter les touches dans le contrôleur de cette vue et filtrer les gestes.

(En supposant que je comprends ce que vous essayez de faire ...) Je préviens que glisser une vue sélecteur pour changer d'onglet est une interface utilisateur non standard et probablement confondre vos utilisateurs. Comme une vue de sélecteur est perçue comme un type de contrôle, elle n'attendra que l'action normale du sélecteur. Comment pourraient-ils même savoir glisser une vue de sélecteur horizontalement?

+0

S'il s'agit de la bonne réponse, veuillez cocher la case correspondante. – TechZen

+1

Vous pouvez certainement sous-classer UIPickerView, et c'est en fait une bonne idée à faire dans certains cas, mais la deuxième moitié de votre réponse n'est pas mauvaise. – pob21

0

Je l'ai laissé seul. Cela aurait été déroutant, vous avez raison.

-1

ZT> Vous ne pouvez pas sous-classer UIPickerView. "Afin de faire tourner la vue du sélecteur plus longtemps, j'ai sous-classé UIPickerView.Ma sous-classe avait exactement une méthode" de Longer Spinning and Blurring. Voir aussi UIPickerView Class Reference: "La classe UIDatePicker utilise une sous-classe personnalisée de UIPickerView pour afficher les dates et les heures."

2

Vous pouvez sous-classer UIPickerView. Le problème est qu'il est composé de neuf sous-vues, dont l'une, appelée UIPickerTable, reçoit les événements tactiles comme touchesBegan:withEvent: pour les lignes que vous voulez. J'ai réussi à intercepter ceux-ci avec le code inclus à la fin de ce post: Responding to touchesBegan in UIPickerView instead of UIView

Les autres réponses/commentaires là-bas sont utiles aussi. Je voulais effacer l'air, pas pour quelqu'un qui fait quelque chose de non standard (comme dans cette question), mais pour quelqu'un qui est arrivé ici et qui souhaite sous-classer UIPickerView, parce que la première ligne de la réponse acceptée est complètement fausse.

+0

Lorsque je regarde les sous-vues de UIPickerView au moment de l'exécution, j'en vois seulement 3, qui se contentent de dire qu'il s'agit de classes UIView standard. – stonedauwg