Несоответствующие результаты с пинчами в UITextView
Я пытаюсь найти лучший способ обработки жестов в UITextView. В настоящее время я пытаюсь обработать все это в UITextView, но я получаю противоречивые результаты. Кажется, что он может поймать мои прикосновения в методе "штрихи начались", но он не всегда улавливается в методе "прикосновения перемещаются".
Было бы лучше обрабатывать касания в представлении, и чтобы UITextView передавал события мультитача? Было бы лучше сделать что-нибудь хитрое, например, поместить UITextView в представление прокрутки?
На данный момент все, что я хотел бы сделать, это настроить размер шрифта для мультитач-пинч или развернуть, что я могу приступить к работе, но это не является последовательным, и я думаю, что мне удалось просто запутать UITextView больше, чем на самом деле получить результаты.
Мой элемент управления является подклассом UITextView и реализует UITextViewDelegate:
#import "MyUITextView.h"
@implementation MyUITextView
/* skipping unimportant code */
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
if([touches count] == 2)
{
NSLog(@"two touches");
UITouch *first = [[touches allObjects] objectAtIndex:0];
UITouch *second = [[touches allObjects] objectAtIndex:1];
initialDistance = [self distanceBetweenTwoPoints:[first locationInView:self] toPoint:[second locationInView:self]];
}
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"touches moved");
if([touches count] == 2)
{
self.scrollEnabled = NO;
UITouch *first = [[touches allObjects] objectAtIndex:0];
UITouch *second = [[touches allObjects] objectAtIndex:1];
CGFloat currentDistance = [self distanceBetweenTwoPoints:[first locationInView:self] toPoint:[second locationInView:self]];
if(initialDistance == 0)
initialDistance = currentDistance;
else if(currentDistance > initialDistance)
{
NSLog(@"zoom in");
self.scrollEnabled = YES;
self.font = [UIFont fontWithName:[self.font fontName] size:[self.font pointSize] + 1.0f];
self.text = self.text;
}
else if(currentDistance < initialDistance)
{
NSLog(@"zoom out");
self.scrollEnabled = YES;
self.font = [UIFont fontWithName:[self.font fontName] size:[self.font pointSize] = 1.0f];
self.text = self.text;
}
}
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"touches ended.");
initialDistance = 0;
[super touchesEnded:touches withEvent:event];
}
-(CGFloat)distanceBetweenTwoPoints:(CGPoint)fromPoint toPoint:(CGPoint)toPoint
{
float x = toPoint.x - fromPoint.x;
float y = toPoint.y - fromPoint.y;
return sqrt(x*x + y*y);
}
-(BOOL)canBecomeFirstResponder
{ return NO; }
По сути, я попытался отключить прокрутку, когда у меня есть два прикосновения к экрану, а затем снова включить его, когда я закончил. Кроме того, отключена возможность стать первым респондентом, чтобы мне не пришлось бороться с меню копирования и вставки. Если есть лучший способ сделать это, допуская меню копирования и вставки при использовании одного касания, я все уши. Я думаю, что в основном я работаю с более сложным примером для моего первого вступления в этот бизнес жестов.
Кроме того, поскольку элемент управления обрабатывает все свои собственные элементы, я не думал, что ему нужно передавать события касания, поскольку он сам обрабатывает их. Я ошибся?
Наконец, этот мой UITextView создается программно и помещается в UINavigationControl. Я не знаю, имеет ли это значение или нет.
1 ответ
Я думаю, что я бы начал с полной регистрации всех касаний и всех событий. Убедитесь, что вы зарегистрировали свойство view касаний.
Вы также можете подкласс UIWindow
создать диагностический класс, который будет регистрировать каждое прикосновение в приложении. Это может быть очень полезно для точного определения того, где и когда происходит касание. Вы можете обнаружить, что касания перенаправляются на другие виды, чем вы ожидаете.
Как отмечено в комментариях к ФП, touchesMoved:
можно вызвать одним касанием движущегося мультитач-жеста. Так что, если вы начинаете жест в два касания, как щепотка, но двигаете только одним пальцем, вы получаете только одно касание touchesMoved:
, Например, люди часто выполняют щепотку, опуская большой и указательный пальцы, а затем перемещая только указательный палец. (Даже если они перемещают оба, указательный палец всегда будет перемещаться на большее расстояние, чем большой палец, потому что он длиннее.)