在UIScrollView中处理UITextField的touchesBegan方法

Ank*_*han 2 iphone objective-c uitextfield

我有一个情况,我必须处理touchesBegan文本字段.此文本字段位于scrollview中.

到目前为止我试过这个:

我创建了UIScrollView的子类

@interface CustomScrollView : UIScrollView
{
}
@end

@implementation CustomScrollView

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

@end
Run Code Online (Sandbox Code Playgroud)

在这里,我可以得到理想的结果.

我用textfields实现了同样的东西.我做了一个子类UITextField:

@interface CustomTextField : UITextField
{
}
@end

@implementation CustomTextField

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

@end
Run Code Online (Sandbox Code Playgroud)

如果文本字段在普通视图中,这可以正常工作,但是当文本字段位于常规scrollView或我的自定义scrollview中时,它会失败.

请赐教我这个

(我这样做是为了在用户长按文本字段时获得类似的内容,文本字段中的文本从Textfield分配到标签,用户可以将此标签拖到视图中的其他位置)

小智 6

默认情况下,UIScrollView会将触摸事件发送到其子视图,直到它可以确定触摸是否应该导致滚动.你可以通过点击并保持你的文本域来证明这一点 - touchesBegan会在片刻之后开火.

要解决此问题,只需将自定义滚动视图的delaysContentTouches属性设置为NO即可.这可以通过取消选中"Delay Content Touches"来通过Interface Builder完成.在代码中,只需执行类似以下操作:

_myCustomScrollView.delaysContentTouches = NO;
Run Code Online (Sandbox Code Playgroud)

您的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;
}
Run Code Online (Sandbox Code Playgroud)

这是CustomTextField实现:

@interface CustomTextField : UITextField {

}

-(void) handleTap:(CGPoint) point;

@end

@implementation CustomTextField

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

@end
Run Code Online (Sandbox Code Playgroud)

这是一个黑客,它不是真正处理触摸(touchesBegan,touchesEnded等),但它的工作原理.