0

我试图找出在 UITextView 中处理捏合手势的最佳方法。目前我一直在尝试在 UITextView 中处理这一切,但我得到的结果不一致。似乎它可以在 touches started 方法中捕捉到我的触摸,但它并不总是在 touchesmoved 方法中捕捉到。

处理视图中的触摸会更好吗,并让 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 中。我不知道这是否有区别。

4

1 回答 1

0

我想我会从完全记录所有触摸和所有事件开始。确保记录触摸的视图属性。

您还可以子类UIWindow化以创建一个诊断类,该类将记录应用程序中的每次触摸。这对于准确查看实际发生触摸的位置和时间非常有用。您可能会发现触摸被路由到与您预期不同的视图。

正如对 OP 的评论中所指出的,touchesMoved:只需轻轻一按即可调用多点触控手势移动。因此,如果您开始像捏合这样的两次触摸手势但只移动一根手指,那么您只能获得一次触摸touchesMoved:。例如,人们经常通过放下拇指和食指然后仅移动食指来进行捏合。(即使他们同时移动,食指移动的距离总是比拇指长,因为它更长。)

于 2009-12-16T13:36:40.183 回答