2013-07-10 14 views
2

이미지 뷰로 그린 원형 그라디언트를 내 색상 선택기의 컬러 휠로 사용하고 있습니다. 팬 제스처 인식기의 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]; 

     } 





    } 

}

그라데이션의 오른쪽에 작동하는 것 같다 왼쪽받는 컬러 업데이트 및 아래쪽을 종료

은 여전히 업데이트 중. 내 UISliders을 방해하지 않기 위해 panGesture을 적절히 제한해야합니다.

아이디어가 있으십니까?

답변

1

터치 이벤트가 서클 영역 내에 있는지 확인하기 만하면됩니다. 이렇게하려면 원의 중심점과 반경을 알아야합니다. 이 작업을 수행하는

일반적인 방정식이 기존의 질문에 덮여 :

Equation for testing if a point is inside a circle

+0

여기서 문제는 다음과 같다. 나는 그라디언트로 imageView를 사용하고 있는데, 그래도 흰색 점을 터치해도 그라디언트의 일부 색상을 제공합니다 ... 컨테이너보기를 만들 수 없으며 거기에 그라디언트를 던져서 내 터치가 있는지 확인할 수 있습니까? 그 특정한 견해에서? – Exothug

+0

확실히 가능하지만 뷰에는 직사각형 경계가 있으며 원형 경계는 없습니다. 따라서 접촉이 원형 영역 내에 있는지 여부를 절대적으로 알아야하는 경우에는 내가 연결된 수식을 사용해야합니다. 희소식은 매우 간단합니다. – lxt

+0

그 의미는 터치가 경계에 다른 방법으로 원 안에 있었는지 묻는 함수를 캡슐화해야한다는 의미입니다. – Exothug

관련 문제