Ограничение распознавателя жестов панорамирования определенным кругом

Я использую круговой градиент, нарисованный в представлении изображения, в качестве цветового круга для моей палитры цветов. Я хочу ограничить распознаватель жестов панорамирования 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.

Есть идеи?


person Exothug    schedule 10.07.2013    source источник


Ответы (1)


Вам просто нужно проверить событие касания, чтобы увидеть, находится ли оно в пределах области круга. Для этого вам нужно знать центральную точку вашего круга и его радиус.

Общее уравнение для этого рассматривается в этом существующем вопросе:

Уравнение для проверки того, находится ли точка внутри круга

person lxt    schedule 10.07.2013
comment
Проблема здесь в следующем. я использую imageView как градиент, и даже если я касаюсь белых пятен, он все равно дает мне некоторый цвет градиента... могу ли я создать представление контейнера, добавить туда градиент и проверить, есть ли мое касание в этом конкретное представление? - person Exothug; 10.07.2013
comment
Вы, конечно, могли бы, но представления имеют прямоугольные границы, а не круглые. Поэтому, если вам абсолютно необходимо знать, было ли касание в пределах круглой области или нет, вам придется использовать формулу, на которую я ссылаюсь. Хорошая новость в том, что это довольно просто. - person lxt; 10.07.2013
comment
это означает, что мне придется инкапсулировать функцию, которая спрашивает, было ли касание в круге, в другой метод, запрашивающий границы? - person Exothug; 10.07.2013
comment
потому что я не вижу другого выхода - person Exothug; 11.07.2013
comment
Ваш распознаватель жестов вернется туда, где касание находится по отношению к вашему представлению, поэтому вам просто нужно поместить его в метод shouldReceiveTouch. - person lxt; 11.07.2013
comment
не могли бы вы привести пример по этому поводу? (бонусные баллы за смешные названия переменных!) - person Exothug; 11.07.2013