2010-01-11 2 views
4

Неужели кто-нибудь смог реализовать успешный салфетки на UITableView? По умолчанию это невозможно из-за зависания элемента управления. Я попытался подклассифицировать UITextView и реализовать функцию swipe в методах экземпляра, но без кубиков.Успешный пробел в UITextView?

У меня отключена прокрутка UITextView - Если нет другого способа реализовать многострочный текст?

[редактировать] То, что я должен сказать, ввод многострочного текста [/ Edit]

ответ

3

Вот подкласс UITextView, который будет обнаруживать пойло жест ...

Это то, что вы ищете ?

#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

Спасибо - я попробую сегодня на какой-то момент, и пусть вы знаете, как она идет. – mootymoots

+0

Боюсь, что это не сработало. Я добавил его в качестве подкласса, изменил класс на мой новый подкласс в Interface Builder, а также обновил класс в моем основном контроллере представления до подкласса, но не было обнаружено прокрутки :-( – mootymoots

1

Обычно вы реализуете события реагирования касания в UITableViewCell, которые могут распознавать салфетки и что-то делать. UITableViews наследуется от UIScrollView, который не любит переопределять события касания.

+0

Привет, вы можете подробнее объяснить почему UIScrollView не любит переопределять свои события касания? – Ross

+1

Не очень много, кроме того, что он делает много сложной работы с событиями касания, и поэтому, когда он не получает все, что он не может понять, что происходит. извините, я не могу добавить больше деталей, я просто знаю по опыту, что это не работает. –

0

Вы также можете использовать два пальца. Когда я возвращаюсь домой, я могу уточнить с какой-то код, но это было то, что я использовал

2

Добавьте прозрачный UIView на вершине UITextView и использовать его для обработки салфетки и отправить touchesBegan/Moved/Ended/Canceled: сообщения в текстовом виде, чтобы сохранить нормальный взаимодействие.

2

Я взял код Росса и добавил несколько вещей, которые мне помогли. В частности, этот код не будет реагировать на салфетки, пока он не остановится. Это также предотвращает прокрутку с противоположного направления.

#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

Еще лучшее решение, я нашел, чтобы просто передать штрихи обратно в надтаблицы:

@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 
Смежные вопросы