2010-02-16 13 views
0

J'ai des viewcontrollers configurés pour suivre les gestes et commettre une action, dans ce cas, changer l'onglet. Le code pour les viewcontrollers est comme suit:iPhone - Gestes UIWebView

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

Je voudrais avoir le même geste faire la même chose sur un UIWebView j'ai mis en place sous la vue du viewcontroller. En bref, l'uiwebview est sur la vue. Quand je balaye, je viens d'obtenir les fonctions de base de uiwebview (défilement). Si je configure une classe uiwebview personnalisée avec le même code que le uiviewcontroller, j'obtiens des erreurs. J'ai besoin de savoir comment traduire ce bloc de code, en gardant la fonctionnalité intacte, pour convenir à uiwebview.

+0

Vous voulez dire que vous avez sous-classé UIWebView et ajouté ce code et vous obtenez des erreurs? Quelles erreurs obtenez-vous? – Don

Répondre

1

Vous devriez être en mesure de sous-classer UIWebView et remplacer ces méthodes. Vous pourriez avoir à remplacer toutes les méthodes tactiles, cependant,

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 

EDIT: Ah, je vois vos erreurs maintenant. Ils sont parce que ces choses ne sont pas applicables à l'UIWebView comme ils le faisaient au parent (que vous connaissez déjà ...)

Depuis UIWebView est un UIView, vous devriez être en mesure de remplacer

[touch locationInView:self.view] 

avec

[touch locationInView:self] 

pour obtenir au contrôleur de barre d'onglets du parent, cependant, vous devrez concevoir une autre façon de le faire. Vous pouvez passer une référence au parent à votre sous-classe UIWebView et d'exposer une méthode sur le parent pour changer l'onglet actif, par exemple:

Dans votre sous-classe, ajoutez une propriété pour l'onglet parent contrôleur de barre:

UITabBarController *parent; 

Lors de la création de votre sous-classe UIWebView et l'ajouter au contrôleur de barre d'onglets, définissez également le parent:

webView.parent = self; 

Si vous configurez cela dans Interface Builder, faire le parent d'un IBOutlet et le brancher via IB.

Dans votre vue du contrôleur de la barre d'onglets, ajoutez une méthode qui modifie le contrôleur sélectionné. Vous pouvez utiliser des constantes nommées pour la vue que vous souhaitez passer, ou des méthodes qui décrivent exactement ce que vous passez, mais pour la simplicité, vous feriez quelque chose de cette conception similaire:

- (void) switchToView: (int)viewNumber 
{ 
    self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:viewNumber]; 
} 

puis appelez [parent switchToView:2] dans votre code.

Un autre moyen, sans doute meilleur, est d'utiliser NSNotification s, en enregistrant le parent en tant qu'auditeur.

+0

Vérifiez mon post précédent. Je vous remercie. – intl

+0

Merci d'avoir répondu.J'ai compris le self.view à moi-même, mais je suis coincé sur la partie tabBarController. Peux tu développer ta pensée à ce propos? – intl

+0

Donc le code code bien, je vais éditer mon post. – Don

0

Mon code complet est le suivant:

#import "CustomWebView.h" 

@implementation CustomWebView 

//Swipe between tabs 
#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]; "error: request for member 'view' in something not a structure or union" 


    if(mystartTouchPosition.x != newTouchPosition.x || mystartTouchPosition.y != newTouchPosition.y) { 
     isProcessingListMove = NO; 
    } 
    mystartTouchPosition = [touch locationInView:self.view]; "error: request for member 'view' in something not a structure or union" 
    [super touchesBegan:touches withEvent:event]; 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = touches.anyObject; 
    CGPoint currentTouchPosition = [touch locationInView:self.view]; "error: request for member 'view' in something not a structure or union" 

    // 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]; "error: request for member 'tabBarController' in something not a structure or union" 
      return; 
     } 
     else { 
      isProcessingListMove = YES; 

      self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:2]; "error: request for member 'tabBarController' in something not a structure or union" 

      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]; 
} 
// End of swipe 

@end 

Les erreurs sont les suivantes sont incluses dans le code.

J'apprécie l'aide.