Iphone 定义UITextView的最大方差
如果您有一个正常的Iphone 定义UITextView的最大方差,iphone,objective-c,cocoa-touch,uitextview,swipe,Iphone,Objective C,Cocoa Touch,Uitextview,Swipe,如果您有一个正常的UITextView,其中包含大量文本,您可以上下滑动: 如果你在水平线上向左或向右滑动,什么也不会发生 如果你以非常小的角度向左或向右滑动,你将向上或向下滑动 因此,显然存在某种类型的类定义,它告诉UITextView何时对刷卡做出反应,何时不对刷卡做出反应。我想是一个最大方差常数 我的问题是,我试图将UITextView子类化以启用左/右滑动。但是,您需要以非常直线的方式刷卡,否则,您将得到向上或向下的刷卡。所以我的问题是,是否有办法重新定义UITextView的标准方
UITextView
,其中包含大量文本,您可以上下滑动:
- 如果你在水平线上向左或向右滑动,什么也不会发生
- 如果你以非常小的角度向左或向右滑动,你将向上或向下滑动
UITextView
何时对刷卡做出反应,何时不对刷卡做出反应。我想是一个最大方差常数
我的问题是,我试图将UITextView
子类化以启用左/右滑动。但是,您需要以非常直线的方式刷卡,否则,您将得到向上或向下的刷卡。所以我的问题是,是否有办法重新定义UITextView的标准方差变量
这是我的subclass.m文件。请注意,kMaximumVariance
实际上没有任何效果,因为标准UITextView
类提供的任何差异都会覆盖它:
//
// SwipeTextView.m
// Swipes
//
#import "SwipeTextView.h"
#import "PageView.h"
#define kMinimumGestureLength 15
#define kMaximumVariance 100
@implementation SwipeTextView
@synthesize delegate, gestureStartPoint;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
UITouch *touch =[touches anyObject];
gestureStartPoint = [touch locationInView:self];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesMoved:touches withEvent:event];
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesEnded:touches withEvent:event];
[self resignFirstResponder]; // this hides keyboard if horizonal swipe
UITouch *touch = [touches anyObject];
CGPoint currentPosition = [touch locationInView:self];
CGFloat deltaXX = (gestureStartPoint.x - currentPosition.x); // positive = left, negative = right
CGFloat deltaYY = (gestureStartPoint.y - currentPosition.y); // positive = up, negative = down
CGFloat deltaX = fabsf(gestureStartPoint.x - currentPosition.x); // will always be positive
CGFloat deltaY = fabsf(gestureStartPoint.y - currentPosition.y); // will always be positive
NSLog(@"deltaXX (%.1f) deltaYY (%.1f) deltaX (%.1f) deltaY (%.1f)",deltaXX, deltaYY, deltaX, deltaY);
if (deltaX >= kMinimumGestureLength && deltaY <= kMaximumVariance) {
if (deltaXX > 0) {
NSLog(@"Horizontal Left swipe - FINISHED detected");
}
else {
NSLog(@"Horizontal Right swipe - FINISHED detected");
}
}
}
@end
尝试向视图中添加一个,并将其设置为false,以使滑动手势不会通过。这将使您能够更准确地检测左右运动
如果这不起作用,请实现自己的UIgestureRecognitizer
子类,并添加该子类
编辑
将手势识别器添加到控制器的viewDidLoad
方法中的UITextView
在代理方法中,您不能在
手势识别器:shouldReceiveTouch:
中返回NO
,因为这意味着手势识别器不会检查传入的触摸对象。在您的情况下,您希望在水平滑动时返回YES
,否则返回NO
,这样垂直滑动将通过,而水平滑动则由您完成 不需要子类。将textView.userInteractionEnabled设置为否,然后在textView上放置一个透明的UIView。在UIView上以任何方式处理触摸和手势,并使textView以编程方式响应这些操作 谢谢!然而,我不太确定如何以及在何处实现这一点。我做了一个开始(见上面编辑的帖子),但我想这不是你真正的意思,对吧?我需要在哪里添加UISweepGestureRecognizer的实例?在我看来,是什么?抱歉,如果这是基本的,但我还是一个初学者。另外,我不太确定整体概念:目标是控制哪些触摸到达UITextView,对吗?也就是说,取消那些角度不在方差变量范围内的接触?对不起,我觉得很愚蠢,但我还是不明白。我编辑了我的帖子(见上文)——但我仍然不明白为什么我需要添加UIGestureRecognitizer(它目前没有做任何事情)。此外,我不确定如何防止UITextView处理左/右滑动并更改滑动方向的准确性。因此,在某种程度上,我回到了原点——我仍然不知道如何根据需要调整滑动方向。谢谢你的帮助!我用另一个项目做了这件事,但它证明是一件痛苦的事。我真的不知道如何将触摸(在透明的UIView上进行)传递到UITextView或UITextField。。。此外,我有时需要删除这个透明的UIView。总之,这是一种痛苦,感觉不是很优雅。为什么你需要传递一个触摸到textView?uiview上的所有触摸操作都可以转换为uitextview上的编程调用。我同意你的看法,虽然不是很优雅,但它确实有效。例如,你如何通过编程方式将uiview上的触摸传递给uitextview?想象触摸transparanet uiview的下部区域,其下方有一个大小相同(320x480)的uitextview。现在我希望点击被传递到uitextview上-你会怎么做?你能不能得到触摸点并可能改变uitextview上的光标位置?不。这正是问题所在。每当用户触摸屏幕时,我都必须将光标放在textview的最开头。我不知道如何传递接触点——它似乎总是被看不见的视图“吞噬”,不管我多么努力地将它传递给UITextView。
// Prevent recognizing touches
- (BOOL)gestureRecognizer:(UISwipeGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([gestureRecognizer direction] == UISwipeGestureRecognizerDirectionLeft) {
// Left swipe: I want to handle this
return YES;
}
if ([gestureRecognizer direction] == UISwipeGestureRecognizerDirectionRight) {
// Right swipe: I want to handle this
return YES;
}
if ([gestureRecognizer direction] == UISwipeGestureRecognizerDirectionUp) {
// Up swipe: textView needs to handle this
return NO;
}
if ([gestureRecognizer direction] == UISwipeGestureRecognizerDirectionDown) {
// Down swipe: textView needs to handle this
return NO;
} else
return YES;
}
-(void)viewDidLoad
{
UITapGestureRecognizer *GesRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doSomething:)];
[GesRec setCancelsTouchesInView:NO];
[self addGestureRecognizer:GesRec];
[GesRec release];
}
-(void)doSomething
{
NSLog(@"doSomething");
}