我试图找出在 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 中。我不知道这是否有区别。