将捏合手势从自定义 UIView 传递到父 UIScrollView

Posted

技术标签:

【中文标题】将捏合手势从自定义 UIView 传递到父 UIScrollView【英文标题】:Pass pinch gesture from custom UIView to parent UIScrollView 【发布时间】:2013-09-14 06:39:53 【问题描述】:

我有一个自定义UIView 作为UIScrollView 中的子视图。

selected 时,用户可以通过在屏幕上任意位置捏捏来调整子视图的大小(子视图很小)。

deselected 时,我希望将这个捏合手势传递给 UIScrollView,以便它可以像往常一样处理它。

这是我正在尝试的。

- (IBAction)pinchInView:(UIPinchGestureRecognizer *)sender 

    if (self.item.isSelected) 
    
        if ((sender.state == UIGestureRecognizerStateChanged) || (sender.state == UIGestureRecognizerStateEnded))
        
            [self.item resizeWithScaleFactor:sender.scale];
        
     else 
    
        [self.scrollView setZoomScale:self.scrollView.zoomScale *= sender.scale];
    
    sender.scale = 1;

虽然它确实有效,但这似乎是一种尴尬的方式。

有没有办法让 UIScrollView 自己处理缩放

我几乎也使用与平移手势相同的方法。

如果有任何方法可以减少这种尴尬,我非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

为您添加到子视图的手势提供一个代表。在委托中实现以下方法

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecoznizer shouldReceiveTouch:(UITouch *)touch
    if(isSelected == true)
        return YES;
    else
        return NO;
    

【讨论】:

为了更安全,我还将UIPinchGestureRecognizer 保存在该类的实例变量中,并确保进入gestureRecognizer:shouldReceiveTouch:UIGestureRecognizer 是我们的手势识别器。但总的来说,我支持这个答案。【参考方案2】:

实现下面的委托方法

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

【讨论】:

以上是关于将捏合手势从自定义 UIView 传递到父 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

使用捏合手势时,uiview 的边界是不是会发生变化?

在 MPMoviePlayerController 上执行捏合手势时屏幕黑屏

如果*** UIView 没有收到它想要处理的手势,则将手势/触摸传递给另一个 UIView?

UIScrollView的缩放原理

使用 UIPinchGestureRecognizer 调整 UIView 的大小

iOS 手势操作:拖动捏合旋转点按长按轻扫自定义