Несоответствующие результаты с пинчами в UITextView - PullRequest
0 голосов
/ 15 декабря 2009

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

0 голосов
/ 16 декабря 2009

Я думаю, что я бы начал с полной регистрации всех касаний и всех событий. Убедитесь, что вы зарегистрировали свойство view касаний.

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

Как отмечено в комментариях к ОП, touchesMoved: можно вызвать одним касанием движения мультитач. Так что, если вы начнете жест с двумя касаниями, как щепотка, но будете двигать только одним пальцем, вы получите только одно касание в touchesMoved:. Например, люди часто выполняют щепотку, опуская большой и указательный пальцы, а затем перемещая только указательный палец. (Даже если они перемещают оба, указательный палец всегда будет перемещаться на большее расстояние, чем большой палец, потому что он длиннее.)

...