将平移手势识别器限制为特定圆圈

Posted

技术标签:

【中文标题】将平移手势识别器限制为特定圆圈【英文标题】:Limiting a pan gesture recognizer to a specific circle 【发布时间】:2013-07-10 09:12:22 【问题描述】:

我正在使用在图像视图中绘制的圆形渐变作为我的颜色选择器的色轮。我想将平移手势识别器的 shouldReceiveTouch: 限制为渐变的位置,以便视图的其余部分不受平移手势识别器的影响。

如何指定与渐变半径匹配的圆形边界?

编辑:我尝试了以下代码但没有效果:

if (sender.numberOfTouches)
    
        CGSize size = CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height/3);

        float radius = MIN(size.width, size.height)/2;

        [alphaSlider addTarget:self action:@selector(changeOpacity:) forControlEvents:UIControlEventValueChanged];
        [hellSlider addTarget:self action:@selector(changeBrightness:) forControlEvents:UIControlEventValueChanged];
        [saturationSlider addTarget:self action:@selector(saturate:) forControlEvents:UIControlEventValueChanged];
        [rSlider addTarget:self action:@selector(redSlider:) forControlEvents:UIControlEventValueChanged];
        [gSlider addTarget:self action:@selector(greenSlider:) forControlEvents:UIControlEventValueChanged];
        [bSlider addTarget:self action:@selector(blueSlider:) forControlEvents:UIControlEventValueChanged];




        CGPoint lastPoint = [sender locationOfTouch: sender.numberOfTouches - 1 inView: gradientView];
        CGPoint center = CGPointMake((size.width/2), (size.height /2));
        CGPoint delta = CGPointMake(lastPoint.x - center.x,  lastPoint.y - center.y);
        CGFloat angle = (delta.y == 0 ? delta.x >= 0 ? 0 : M_PI : atan2(delta.y, delta.x));
        angle = fmod(angle,  M_PI * 2.0);
        angle += angle >= 0 ? 0 : M_PI * 2.0;
        if((lastPoint.x - center.x) + (lastPoint.y - center.y)/2 < radius)
        
            UIColor *color = [UIColor colorWithHue: angle / (M_PI * 2.0) saturation:saturationSlider.value brightness:hellSlider.value alpha:alphaSlider.value];
            if ([color getRed: &r green: &g blue:&b alpha: &a])
            
                NSLog(@"Color value - R : %g G : %g : B %g", r*255, g*255, b*255);
            
            float red = r;
            float green = g;
            float blue = b;
            rText.text = [NSString stringWithFormat:@"%.0f",rSlider.value];
            gText.text = [NSString stringWithFormat:@"%.0f",green*255];
            bText.text = [NSString stringWithFormat:@"%.0f",blue*255];


            colorView.backgroundColor = [UIColor colorWithRed:(rText.text.floatValue/255) green:(gText.text.floatValue/255) blue:(bText.text.floatValue/255) alpha:alphaSlider.value];
            rSlider.value = red*255;
            gSlider.value = green*255;
            bSlider.value = blue*255;
            alphaText.text = [NSString stringWithFormat:@"%.2f",alphaSlider.value];
            brightnessText.text = [NSString stringWithFormat:@"%.2f",hellSlider.value];
            saturationText.text = [NSString stringWithFormat:@"%.2f",saturationSlider.value];

        





    

它似乎在渐变的右侧工作并停止接收颜色更新,左侧和下侧仍在更新。我需要适当限制panGesture,以使其停止干扰我的UISliders

有什么想法吗?

【问题讨论】:

【参考方案1】:

您只需要对触摸事件进行点击测试,看看它是否在圆圈的区域内。为此,您需要知道圆的中心点及其半径。

这个现有问题涵盖了这样做的一般方程式:

Equation for testing if a point is inside a circle

【讨论】:

这里的问题如下。我正在使用 imageView 作为渐变,即使我触摸白点,它仍然会给我一些渐变颜色...我可以不创建容器视图,将渐变放入其中并检查我的触摸是否在那个具体观点? 当然可以,但是视图有矩形边界,而不是圆形边界。因此,如果您绝对需要知道触摸是否在圆形区域内,则必须使用我链接到的公式。好消息是它非常简单。 这意味着我必须将询问触摸是否在圆圈中的函数封装到另一个要求边界的方法中? 因为我没有看到任何其他方式 您的手势识别器将返回与您的视图相关的触摸位置,因此您只需将其放入shouldReceiveTouch 方法中。

以上是关于将平移手势识别器限制为特定圆圈的主要内容,如果未能解决你的问题,请参考以下文章

核心绘图平移手势识别器 requireGestureRecognizerToFail

在SpriteKit中使用平移手势识别器

SWRevealViewController 平移手势识别器问题

平移手势识别器的三层混淆

仅在长按识别器触发后执行平移手势识别器

如何禁用 UIScrollView 到平移手势识别器?