Я пытаюсь найти лучший способ обработки жестов в 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. Я не знаю, имеет ли это значение или нет.