Переместите кнопку (влево/вправо) в рамке прямоугольника, как переключатель

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

- (void)wasDragged:(UIButton *)button withEvent:(UIEvent *)event
{

   UITouch *touch = [[event touchesForView:button] anyObject];

   //get delta
    CGPoint previousLocation = [touch previousLocationInView:button];
    CGPoint location = [touch locationInView:button];
    CGFloat delta_x = location.x - previousLocation.x;
    CGFloat delta_y = location.y - previousLocation.y;

   //move button
    button.center = CGPointMake(button.center.x + delta_x,
                                button.center.y + delta_y);   


}

Я могу переместить кнопку (прикосновением и перетаскиванием), но как ограничить кнопку, чтобы она могла перемещаться только влево/вправо в рамке прямоугольника.

1
nl ja de

3 ответы

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

Если что-то непонятно, напишите комментарий, и я попытаюсь объяснить.

// Method for movement of the bouncing pad. Restricted movement to x-axis inside of bounds.
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *aTouch = [touches anyObject];
    CGPoint loc = [aTouch locationInView:self];
    CGPoint prevloc = [aTouch previousLocationInView:self];

    CGRect myFrame = self.frame;

   //Checking how far we have moved from the previous location
    float deltaX = loc.x - prevloc.x;

   //Note that we only update the x-position of the pad to prevent it from moving in the y-direction.
    myFrame.origin.x += deltaX;

   //Making sure that the bouncePad cannot move outside of the screen
    if(myFrame.origin.x < 0){
        myFrame.origin.x = 0;
    } else if (myFrame.origin.x + myFrame.size.width > [UIScreen main Screen].bounds.size.width) {
        myFrame.origin.x = [UIScreen mainScreen].bounds.size.width - myFrame.size.width;
    }

   //Setting the bouncing pad frame to the one with the updated position from the touches moved event.
    [self setFrame:myFrame];

}
2
добавлено
+1 сделал бы меня счастливым, если бы это помогло вам! :)
добавлено автор Groot, источник
Спасибо, я пытаюсь с этим кодом.
добавлено автор user1787741, источник

Вы должны изменить только X не Y, если вы хотите переместить влево и вправо, просто измените код, как показано ниже

// move button YOUR CODE
button.center = CGPointMake(button.center.x + delta_x,
                            button.center.y + delta_y);

// move button REMOVED + delta_y
button.center = CGPointMake(button.center.x + delta_x,
                            button.center.y);
1
добавлено
вы можете поместить проверку как float x = button.center.x + delta_x; if (x> 10 || x <200) {button.center = CGPointMake (x, button.center.y);} или используйте свой фрейм x и ширину + x
добавлено автор iphonic, источник
Спасибо, я сделал это, но как мне ограничить рамку.
добавлено автор user1787741, источник

Либо скопируйте координаты для экстремумов, либо сделайте их в пределах представления (ur rectange) и используйте клипы для ограничений для вашей кнопки

0
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.