Перетащите UIButton, но ограничьте границы - PullRequest
0 голосов
/ 04 августа 2011

Я не прошу давать примеры кодовых ответов, просто очень хотелось бы получить толчок в правильном направлении.Мои поиски не были хорошими.

У меня есть кнопка UIB, которую я могу свободно перемещать по экрану.

Я бы хотел ограничить область перетаскивания этого объекта, чтобы его можно было перемещать только вверх и вниз или из стороны в сторону.Я считаю, что мне нужно получить координаты x, y границ, а затем ограничить движение за пределами этой области.Но это далеко, как я получил.Мои знания не распространяются дальше.

Кто-нибудь реализовывал нечто подобное в прошлом?

Адам

Ответы [ 2 ]

4 голосов
/ 05 августа 2011

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

Вы можете наложить ограничения, протестировав центр жеста и сбросив значения центра, если они вам не нравятся. Ниже предполагается, что кнопка подключена к действию для всех событий Touch Drag, но этот принцип по-прежнему применяется, если вы используете распознаватели жестов или touchesBegan: и друзей.

- (IBAction)handleDrag:(UIButton *)sender forEvent:(UIEvent *)event 
{
    CGPoint point = [[[event allTouches] anyObject] locationInView:self.view];

    if (point.y > 200)
    {
        point.y = 200; //No dragging this button lower than 200px from the origin!
    }

    sender.center = point;
}

Если вам нужна кнопка, которая скользит только по одной оси, это достаточно просто:

- (IBAction)handleDrag:(UIButton *)sender forEvent:(UIEvent *)event 
{
    CGPoint point = [[[event allTouches] anyObject] locationInView:self.view];  
    point.y = sender.center.y; //Always stick to the same y value

    sender.center = point;
}

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

- (IBAction)handleDrag:(UIButton *)sender forEvent:(UIEvent *)event 
{   
    CGPoint point = [[[event allTouches] anyObject] locationInView:self.someView];

    if ([self.someView pointInside:point withEvent:nil])
    {
        sender.center = point; 
        //Only if the gesture center is inside the specified view will the button be moved
    }
}
1 голос
/ 04 августа 2011

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

Я подозреваю, что вам может пригодиться эта функция:

bool CGRectContainsPoint ( CGRect rect, CGPoint point );
...