2013-11-19 2 views
0

У меня есть круговой UIBezierPath. Я использую путь для рисования круга на моем представлении, чтобы создать схему 24-часовых часов. У меня есть UIButton, положение которого зависит от текущего времени. Кнопка действует как рука «Час». Я хочу, чтобы пользователи могли перемещать UIButton по круговой траектории. Я называю это «посещать будущее/прошлое». Как ограничить движение кнопок по пути, который у меня есть?Ограничение движения UIButton по пути UIBezierPath

+0

Предполагается, что кнопка должна отвечать линейным жестам? – Suhas

+0

В настоящее время я использую 'UILongGestureRecognizer' – nupac

+0

. Чтобы обнаружить длинное нажатие, которое, как я предполагаю, вы будете использовать, чтобы начать операцию перетаскивания. Как кнопка должна вести себя, если пользователь теперь перетаскивает кнопку по прямой? – Suhas

ответ

1

Override touchesBegan: и touchesMoved: методы в вашей точки зрения

- (void)touchesBegan: (NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if([[event touchesForView:button] count]) 
    { 
     //User is trying to move the button set a variable to indicate this. 
    } 
} 



- (void)touchesMoved: (NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGPoint *point = [[event anyObject] locationInView:self]; 

    /*Compare x and y coordinates with the centre property of the button 
     If x or y are greater set center of button to next point in circle or previous 
     point if any of them are lesser.*/ 
} 

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

+0

Нужен ли мне первый метод? У меня уже есть начальная точка, когда я устанавливаю позицию кнопки в соответствии со временем. И я бы предпочел рассчитать этот вопрос, но как бы? У меня есть радиус, но мне не нужен угол относительно центральной точки? – nupac

+0

Поскольку вы переопределяете штрихи, перемещенные по виду, он будет вызываться для всех касаний, первый способ должен сообщить вам, что пользователь фактически начал, нажав кнопку – Suhas

+0

Даже если вы вычислите угол, который вам, наконец, нужно будет преобразовать что к точкам по окружности. Это поможет вам лучше использовать очки вместо этого. – Suhas

0

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

CGPoint point = [touch locationInView:circleView]; 

if (![circleView pointInside:point withEvent:event]) { 
    return; 
} 
+0

Я посмотрю на «pointInside: withEvent:» и вернусь к вам. Спасибо – nupac

+0

У меня есть пользовательский UIView. В этом представлении drawRect я рисую круг. Если я тогда использую 'pointInside: withEvent:', это сработает? Круг не является самостоятельным uiview, он нарисован на виде. – nupac

+0

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

Смежные вопросы