UIScrollView 中的触摸交互

Posted

技术标签:

【中文标题】UIScrollView 中的触摸交互【英文标题】:Touch Interaction in a UIScrollView 【发布时间】:2013-05-17 10:37:48 【问题描述】:

有一些与此类似的帖子,但我无法将其他响应调整为我的代码。在我的scrollview 中使用touchesBegantouchesMovedtouchesEnded 方法时遇到问题。

我目前有一个大的scrollview (3072 x 2304)。我有一个 UIImageView 作为 subview 并希望检测到任何一个的触摸(这并不重要,因为它会对我产生相同的结果)。

这是我目前的处理方法:

 //Set scrollview to size of image
self.myScrollView.contentSize = CGSizeMake(3072, 2304);

//Load image in big rect
UIImageView *myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0, 3072, 2304)];

//set image to pic in bundle
myImageView.image = [UIImage imageNamed:@"dot.jpg"];

//make imageview subview of scrollview
[self.myScrollView addSubview: myImageView];

//Making subview for touches
CGRect frame  = CGRectMake(0, 0, 3072, 2304);
touchView = [[UIScrollView alloc] initWithFrame:frame];
[self.myScrollView addSubview: touchView];

//Allow for 2 touches to move screen
for (UIGestureRecognizer *gestureRecognizer in myScrollView.gestureRecognizers)

    if ([gestureRecognizer  isKindOfClass:[UIPanGestureRecognizer class]])
    
        UIPanGestureRecognizer *panGR = (UIPanGestureRecognizer *) gestureRecognizer;
        panGR.minimumNumberOfTouches = 2;            
    
 

注意:

建议使用手势识别器的方法并不理想。 据我所知,除了touchesMoved,别无选择;实现这一点的唯一可行方法是子类化 UIScrollView,但这并没有给我带来任何乐趣。

【问题讨论】:

【参考方案1】:

尝试使用这个。你知道imageview的用户交互默认是false所以你需要设置它true

myImageView.userInteractionEnabled = YES;

您需要在 viewDidLoad 中为滚动视图添加手势

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    gestureRecognizer.delegate = self;
    [scrollView addGestureRecognizer:gestureRecognizer];


-(void) handleGesture:(UIGestureRecognizer *) sender

//------- do here 

【讨论】:

我不太明白这一点。当然 UITapGestureRecognizer 只能检测单点触摸事件?我还需要能够跟踪触摸运动。 在这种情况下,您还需要将该手势添加到滚动视图中 这个方法我已经试过了。问题是 UITapGestureRecognizer 在触地事件后无法检测到移动 - 它的行为类似于 touchesBegan。我需要一些行为类似于 touchesMoved 的东西。 据我所知,如果是子视图,您将无法在滚动视图上获取事件。在这种情况下,您需要添加 getture。 我的目标是创建处理触摸的 UIScrollView 的子视图。 touchesBegan/touchesEnded 方法仅适用于 UIViews。所以这是我要纠正的一个错误。

以上是关于UIScrollView 中的触摸交互的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 问题

UIScrollView 可以滚动,但不能来自用户交互

限制UIScrollView中的可滚动区域

自动滚动 UIScrollView 以适应原生 iOS Mail.app 中的内容

UIButton 没有响应嵌套在另一个 UIScrollView 中的 UIScrollView 中的触摸

嵌入在 UIScrollview 中的 UIWebview 中的 Javascript 触摸事件