我在这里有一种情况,我必须处理文本字段的touchesBegan。此文本字段在滚动视图中。

到目前为止,我已经尝试过了:

我做了UIScrollView的子类

@interface CustomScrollView : UIScrollView
{
}
@end

@implementation CustomScrollView

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"good");
}

@end


在这里,我可以获得预期的结果。

我用文本字段实现了同样的事情。我做了UITextField的子类:

@interface CustomTextField : UITextField
{
}
@end

@implementation CustomTextField

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"good");
}

@end


如果文本字段位于普通视图内,则此方法效果很好,但当文本字段位于常规scrollView或我的自定义滚动视图内时,此方法将失败。

请给我启发

(我这样做是为了在用户长按一个文本字段时获得类似的效果,该文本字段中的文本已从“文本字段”分配给标签,并且用户可以将此标签拖动到视图中的其他位置)

最佳答案

默认情况下,UIScrollView延迟将触摸事件发送到其子视图,直到可以确定是否应该引起触摸滚动为止。您可以通过按住文本框来证明这一点-touchesBegan稍后会触发。

要解决此问题,只需将自定义滚动视图的delaysContentTouches属性设置为NO。可以通过取消选中“延迟内容触摸”,通过Interface Builder来完成。在代码中,只需执行类似于以下操作:

_myCustomScrollView.delaysContentTouches = NO;


现在,您的CustomTextField的touchesBegan方法将立即触发。但是请注意,如果用户的初始点击位于任何子视图的内部,则用户将不再能够在CustomScrollView中滚动。将delaysContentTouches设置为no,请尝试在文本字段(或与此相关的任何子视图)中点击并滑动-您将看到没有滚动发生。当delayContentTouches设置为yes时,用户可以在CustomScrollView范围内的任何位置点击并滑动,然后使其滚动。

如果您希望两全其美(用户可以从任意位置滚动并且子视图可以响应触摸),则可以在CustomScrollView中覆盖hitTest方法,然后将消息发送到被触摸的子视图。这是CustomScrollView中的实现:

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent*)event {
    UIView *hitView = [super hitTest:point withEvent:event];

    if([hitView class] == [CustomTextField class]) {
        [(CustomTextField *) hitView handleTap:point];
    }

    return hitView;
}


这是CustomTextField实现:

@interface CustomTextField : UITextField {

}

-(void) handleTap:(CGPoint) point;

@end

@implementation CustomTextField

-(void) handleTap:(CGPoint) point {
    // Implement your handling code here
}

@end


这是一个黑客,因为它不能真正处理触摸(touchesBegan,touchesEnded等),但是可以工作。

关于iphone - 处理UIScrollView中UITextField的touchesBegan方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1932002/

10-10 20:29