在UITextView中使用Pinches的无意义结果

时间:2009-12-15 18:56:40

标签: iphone objective-c uitextview pinch

我正在试图找出在UITextView中处理捏合手势的最佳方法。目前我一直在尝试在UITextView中处理它,但是我得到了不一致的结果。它似乎可以在触摸开始方法中捕获我的触摸,但它并不总是被触及移动方法。

处理View中的触摸会更好吗,并让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 :(得分:0)

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

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

如对OP的评论中所述,只需轻触多点触控手势即可调用touchesMoved:。因此,如果你开始像捏一样的双触摸手势但只移动一根手指,你只能在touchesMoved:中触摸一下。例如,人们经常通过放下拇指和食指然后仅移动食指来进行捏合。 (即使它们同时移动,食指也会比拇指移动更长的距离,因为它更长。)