我正在试图找出在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中。我不知道这是否有所作为。
答案 0 :(得分:0)
我想我会从完全记录所有触摸和所有事件开始。确保记录触摸的视图属性。
您还可以将UIWindow
子类化,以创建一个诊断类,该类将记录应用程序中的每个触摸。这对于准确查看触摸实际发生的位置和时间非常有用。您可能会发现触摸被路由到不同于您期望的视图。
如对OP的评论中所述,只需轻触多点触控手势即可调用touchesMoved:
。因此,如果你开始像捏一样的双触摸手势但只移动一根手指,你只能在touchesMoved:
中触摸一下。例如,人们经常通过放下拇指和食指然后仅移动食指来进行捏合。 (即使它们同时移动,食指也会比拇指移动更长的距离,因为它更长。)