Mantenga UIView dentro del círculo Objective-C

¿Cómo puedo tener mi selector de color ( UIView ) para permanecer dentro de una rueda de color de 300px 300px? Estoy usando el UIPanGestureRecognizer para arrastrar el selector de color alnetworkingedor de la rueda de colors UIImageView .

El diámetro de la rueda de color es 300px.

Aquí está la image de mi UIViewController :

introduzca la descripción de la imagen aquí

El problema es que se puede arrastrar a cualquier lugar fuera del volante:

introduzca la descripción de la imagen aquí

Entonces, ¿cómo puedo mantener mi UIView que se cierne sobre la rueda de colors dentro del círculo?

Tu ayuda es apreciada.

Esto realmente parece más una cuestión de matemáticas. Si desea evitar simplemente que la subvista deje el círculo, entonces necesita insert alguna lógica donde quiera que haga el código de movimiento.

Primero encuentre el medio del círculo. Suponiendo que la vista en círculo es una UIV vista recortada, encuentre la vista central tomando el

 CGPoint center; center.x = view.frame.origin.x + view.frame.size.width/2; center.y = view.frame.origin.y + view.frame.size.height/2; 

Entonces debes calcular esa distancia entre el toque y el centro del círculo

 CGPoint touch = //location of the touch point CGFloat distance = sqrt( pow(touch.x-center.x,2)+pow(touch.y-center.y,2) ) 

si la distancia es inferior a 300, entonces mueve la subvista como normal

 if (distance < 300) { //do your thing } 

si quieres que la vista deje de moverse donde sea que hayas dejado el círculo y luego encaje donde sea que ingreses nuevamente, entonces puedes detenerte aquí. Si desea moverse en la dirección de su dedo incluso cuando está fuera de la vista, entonces recomiendo formar un vector y multiplicarlo por 300.

 CGPoint newPosition; newPosition.x = touch.x / distance * 300; newPosition.y = touch.y / distance * 300; 

Esto le dará la position en el borde del círculo que está más cerca del punto de contacto.

Calcule la distancia de Pitágoras desde el centro y detenga que el indicador no se arrastre más allá del radio deseado. Incluso puede precalcular el cuadrado del radio una vez, y comparar con eso, para evitar hacer raíces cuadradas.

(distancia al cuadrado = delta x al cuadrado + delta y al cuadrado)