Держите UIView внутри Circle Objective-C

Как я могу сделать так, чтобы мой селектор цвета (UIView) оставался внутри цветового круга размером 300 пикселей на 300 пикселей? Я использую UIPanGestureRecognizer для перетаскивания селектора цвета вокруг цветового круга UIImageView.

Диаметр цветового круга – 300 пикселей.

Вот изображение моего UIViewController:

введите здесь описание изображения

Проблема в том, что его можно перетащить куда угодно за пределы колеса:

введите здесь описание изображения

Итак, как я могу оставить свой UIView, который парит над цветовым кругом, скажем, внутри круга?

Ваша помощь приветствуется.


person atomikpanda    schedule 12.10.2013    source источник
comment
Вы пробовали что-нибудь? Что ваше решение сделало неправильно?   -  person Wain    schedule 12.10.2013
comment
Вы знаете центр и радиус окружности. (Евклидово) расстояние между двумя точками в 2D — довольно простая математика. Что еще вас сдерживает?   -  person David Rönnqvist    schedule 12.10.2013


Ответы (2)


Это действительно больше похоже на математический вопрос. Если вы хотите просто предотвратить выход подвида из круга, вам нужно вставить некоторую логику везде, где вы выполняете код перемещения.

Сначала найдите середину круга. Предполагая, что представление круга является обрезанным UIView, найдите центральное представление, взяв

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

Затем вам нужно рассчитать это расстояние между касанием и центром круга.

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

если расстояние меньше 300, вы перемещаете подвид как обычно

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

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

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

Это даст вам положение на краю круга, которое ближе всего к точке касания.

person Andrew Hoos    schedule 12.10.2013

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

(расстояние в квадрате = дельта х в квадрате + дельта у в квадрате)

person Duncan C    schedule 12.10.2013