Успешное перелистывание в UITextView? - PullRequest
4 голосов
/ 11 января 2010

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

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

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

Ответы [ 6 ]

3 голосов
/ 02 августа 2010

Я нашел еще лучшее решение - просто передать касания суперпредставлению:

@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
3 голосов
/ 11 января 2010

Вот подкласс 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
2 голосов
/ 07 июля 2010

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

#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
2 голосов
/ 11 января 2010

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

1 голос
/ 11 января 2010

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

0 голосов
/ 11 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...