Если у вас есть обычный 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");
}