Определение максимальной дисперсии UITextView - PullRequest
0 голосов
/ 29 сентября 2011

Если у вас есть обычный UITextView с множеством текста в нем, вы можете проводить вверх и вниз:

  • если вы проведете пальцем влево или вправо по очень горизонтальной линии, ничего не произойдет
  • если вы проведете пальцем влево или вправо под очень небольшим углом, вы проведете пальцем вверх или вниз

Так что, очевидно, существует какое-то определение класса, которое сообщает UITextView, когда реагировать на удар, а когда - нет. Я думаю, что-то вроде константы максимальной вариации.

Моя проблема в том, что я пытаюсь создать подкласс UITextView для включения пролистывания влево / вправо. Тем не менее, вам нужно будет провести пальцем по довольно прямой линии, в противном случае вы получите удар вверх или вниз. Так что мой вопрос, есть ли какой-то способ переопределить стандартную переменную дисперсию UITextView?

Вот мой подкласс .m файл. Обратите внимание, что kMaximumVariance на самом деле не имеет никакого эффекта, поскольку он перезаписывается любой дисперсией, которую обеспечивает стандартный класс UITextView:

//
//  SwipeTextView.m
//  Swipes
//

#import "SwipeTextView.h"
#import "PageView.h"

#define kMinimumGestureLength    15
#define kMaximumVariance         100

@implementation SwipeTextView
@synthesize delegate, gestureStartPoint;


- (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];


}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];
    [self resignFirstResponder]; // this hides keyboard if horizonal swipe

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

    CGFloat deltaXX = (gestureStartPoint.x - currentPosition.x); // positive = left, negative = right
    CGFloat deltaYY = (gestureStartPoint.y - currentPosition.y); // positive = up, negative = down

    CGFloat deltaX = fabsf(gestureStartPoint.x - currentPosition.x); // will always be positive
    CGFloat deltaY = fabsf(gestureStartPoint.y - currentPosition.y); // will always be positive


    NSLog(@"deltaXX (%.1f) deltaYY (%.1f) deltaX (%.1f) deltaY (%.1f)",deltaXX, deltaYY, deltaX, deltaY);

    if (deltaX >= kMinimumGestureLength && deltaY <= kMaximumVariance) {
        if (deltaXX > 0) {
            NSLog(@"Horizontal Left swipe - FINISHED detected");
        }
        else {
            NSLog(@"Horizontal Right swipe - FINISHED detected");
        }

    }



} 




@end

EDIT:

Предложение об отмене касаний, достигающих UITextView (см. Ниже):

// Prevent recognizing touches
- (BOOL)gestureRecognizer:(UISwipeGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {

    if ([gestureRecognizer direction] == UISwipeGestureRecognizerDirectionLeft) {
        // Left swipe: I want to handle this
        return YES;
    }
    if ([gestureRecognizer direction] == UISwipeGestureRecognizerDirectionRight) {
        // Right swipe: I want to handle this
        return YES;
    }
    if ([gestureRecognizer direction] == UISwipeGestureRecognizerDirectionUp) {
        // Up swipe: textView needs to handle this
        return NO;
    }
    if ([gestureRecognizer direction] == UISwipeGestureRecognizerDirectionDown) {
        // Down swipe: textView needs to handle this
        return NO;
    } else
        return YES;
}


-(void)viewDidLoad
{

    UITapGestureRecognizer *GesRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doSomething:)];

    [GesRec setCancelsTouchesInView:NO];
    [self addGestureRecognizer:GesRec];
    [GesRec release];

}


-(void)doSomething
{
    NSLog(@"doSomething");
}

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Подкласс не требуется. установите textView.userInteractionEnabled в NO и затем поместите прозрачный UIView поверх вашего textView. обрабатывайте прикосновения и жесты в любом случае на этом UIView и заставляйте textView реагировать на них программно.

1 голос
/ 29 сентября 2011

Попробуйте добавить UISwipeGestureRecognizer к представлению и установите для cancelsTouchesInView значение false, чтобы жест смахивания не был пропущен.Это должно позволить вам более точно определять движение влево и вправо.

Если это не сработает, реализуйте собственный подкласс UIGestureRecognizer и добавьте его вместо этого.

Редактировать

Вы добавляете распознаватель жестов к UITextView в методе viewDidLoad вашего контроллера.

В ваших методах делегата вы не можете вернуть NO в gestureRecognizer:shouldReceiveTouch:, поскольку это означает, что распознаватель жестов не будет проверять входящий сенсорный объект.В вашем случае вы хотите вернуть YES, когда свайп находится в горизонтальном положении, и NO в противном случае, поэтому вертикальные свипы пропускаются, пока вы выполняете горизонтальный свайп.

...