我在这里有一种情况,我必须处理文本字段的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/