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");
}