2010-01-11 6 views
4

Est-ce que quelqu'un a réussi à mettre en œuvre un mouvement de balayage réussi sur un UITableView? Par défaut, cela n'est pas possible en raison de la nature défilante du contrôle. J'ai essayé de sous-classer UITextView et d'implémenter la fonction swipe dans les méthodes d'instance, mais pas de dés.Balayez réussi dans UITextView?

Mon UITextView a désactivé le défilement - À moins qu'il n'y ait une autre façon d'implémenter du texte multiligne?

[Modifier] Ce que je dois dire est saisie de texte multiligne [/ Modifier]

Répondre

3

Voici une sous-classe d'un UITextView qui détecte un geste de grands coups ...

Est-ce que vous cherchez ?

#import <UIKit/UIKit.h> 

#define kMinimumGestureLength 25 
#define kMaximumVariance  5 

@interface SwipeableTextView : UITextView { 
    CGPoint gestureStartPoint; 
} 

@end 

@implementation SwipeableTextView 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 

    UITouch *touch =[touches anyObject]; 
    gestureStartPoint = [touch locationInView:self]; 

} 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesMoved:touches withEvent:event]; 

    UITouch *touch = [touches anyObject]; 
    CGPoint currentPosition = [touch locationInView:self]; 

    CGFloat deltaX = fabsf(gestureStartPoint.x - currentPosition.x); 
    CGFloat deltaY = fabsf(gestureStartPoint.y - currentPosition.y); 

    if (deltaX >= kMinimumGestureLength && deltaY <= kMaximumVariance) { 
     NSLog(@"Horizontal swipe detected"); 
    } 

} 

@end 
+0

Merci - Je vais essayer aujourd'hui à un moment donné et vous permettent de savoir comment il va. – mootymoots

+0

J'ai peur que cela n'a pas fonctionné. Je l'ai ajouté comme une sous-classe, changé la classe à ma nouvelle sous-classe dans Interface Builder, et également mis à jour la classe dans mon contrôleur de vue principal à la sous-classe, mais aucun balayage est détecté :-( – mootymoots

1

Habituellement, vous implémentez les événements tactiles dans un UITableViewCell, qui peut reconnaître le balayage et faire quelque chose. UITableViews hérite de UIScrollView, qui n'aime pas remplacer les événements tactiles.

+0

Salut, pouvez-vous expliquer plus sur pourquoi UIScrollView n'aime pas avoir ses événements tactiles remplacés? – Ross

+1

Pas vraiment beaucoup, à part faire beaucoup de travail complexe avec les événements tactiles et donc quand il n'obtient pas tout ce qu'il ne peut pas comprendre ce qui se passe .. désolé je ne peux pas ajouter plus de détails, je sais juste par expérience que ça ne marche pas bien. –

0

Vous pouvez également utiliser un balayage à deux doigts. Quand je rentre à la maison, je peux élaborer avec un code, mais c'était ce que je l'ai utilisé

2

Ajouter un UIView transparent au-dessus de la UITextView et l'utiliser pour gérer le swipe, et envoyer les touchesBegan/Moved/Ended/Canceled: messages à la vue du texte pour préserver la normale interaction.

2

J'ai pris le code de Ross et ajouté quelques choses qui m'ont aidé. En particulier, ce code ne répondra pas au balayage jusqu'à ce qu'il s'arrête. Il empêche également un balayage d'inverser la direction à mi-chemin à travers.

#import <UIKit/UIKit.h> 

#define kMinimumGestureLength 25 
#define kMaximumVariance  5 

typedef enum swipeDirection { 
    kSwipeNone, 
    kSwipeLeft, 
    kSwipeRight 
} tSwipeDirection; 

@interface SwipeableTextView : UITextView { 
    CGPoint gestureStartPoint; 
    tSwipeDirection swipeDirection; 
} 

@end 

@implementation SwipeableTextView 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 

    swipeDirection = kSwipeNone; 
    UITouch *touch =[touches anyObject]; 
    gestureStartPoint = [touch locationInView:self]; 

} 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesMoved:touches withEvent:event]; 

    UITouch *touch = [touches anyObject]; 
    CGPoint currentPosition = [touch locationInView:self]; 

    CGFloat deltaX = fabsf(gestureStartPoint.x - currentPosition.x); 
    CGFloat deltaY = fabsf(gestureStartPoint.y - currentPosition.y); 

    // Check if we already started a swipe in a particular direction 
    // Don't let the user reverse once they get going 
    if (deltaX >= kMinimumGestureLength && deltaY <= kMaximumVariance && 
     swipeDirection == kSwipeNone) { 
     if (gestureStartPoint.x < currentPosition.x) { 
      swipeDirection = kSwipeRight; 
     } 
     else { 
      swipeDirection = kSwipeLeft; 
     } 
    } 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (swipeDirection == kSwipeRight) { 
     NSLog(@"Swipe right"); 
    } 
    else if (swipeDirection == kSwipeLeft) { 
     NSLog(@"Swipe left"); 
    } 
    [super touchesEnded:touches withEvent:event]; 
} 

@end 
3

Une solution encore meilleure, je l'ai trouvé, est de simplement passer des touches Retour à la superview:

@interface SwipeableTextView : UITextView { 
} 

@end 

@implementation SwipeableTextView 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 

    [self.superview touchesBegan:touches withEvent:event]; 

} 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesMoved:touches withEvent:event]; 

    [self.superview touchesMoved:touches withEvent:event]; 
} 

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

    [self.superview touchesEnded:touches withEvent:event]; 
} 

@end