Как разрешить пользователю перемещать кнопку через iOS SDK - PullRequest
2 голосов
/ 01 июля 2011

Я пытаюсь сделать что-то новое с моим приложением.

У меня есть несколько кнопок, которые я хотел бы, чтобы пользователь мог переставлять на экране, перетаскивая их. Представление в настоящее время создается через Интерфейсный Разработчик. Идеальная реализация будет проверять наличие флага в NSUserDefaults, который, если он присутствует, позволит пользователю переместить объект, отбросить его, а затем убрать флаг, который сохранит настройки для следующей загрузки пользователя.

Кто-нибудь знает, возможно ли что-нибудь подобное?

Ответы [ 3 ]

4 голосов
/ 01 июля 2011

Вы можете сделать это, используя метод действия -

//, вызываемый для каждого экземпляра во время события перетаскивания

- (IBAction)draggedOut: (id)sender withEvent: (UIEvent *) event {
    UIButton *selected = (UIButton *)sender;
    selected.center = [[[event allTouches] anyObject] locationInView:self.view];
} 
3 голосов
/ 01 июля 2011

Поскольку UIControl является UIView, вы можете использовать addGestureRecognizer для установки на вас объекта UIPanGestureRecognizer.

A UIGestureRecognizer позволяет вызывать функцию, которую вы написали, каждый раз, когда конкретный жест выполняется в представлении, к которому вы прикрепляете распознаватель жестов. Вы создаете такой в ​​своем контроллере вида viewDidLoad метод:

-(void)viewDidLoad {
     ...
     gestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleDragOnButton)];
     [button addGestureRecognizer:gestureRecognizer];
     ...
     [super viewDidLoad];
}

Этот код создаст экземпляр распознавателя жестов и прикрепит его к вашей кнопке. Таким образом, каждый жест типа «панорамирование» (перетаскивание), выполняемый на кнопке, вызовет вызов handleDragOnButton. В приведенном выше коде я предполагаю, что ваш контроллер представления содержит объявления вроде:

@interface MyViewController : UIViewController {
    ...
    IBOutlet UIButton* button;   //-- this is created through IB
    UIPanGestureRecognizer* gestureRecognizer;   //-- this will be added by you
    ...
}    

Теперь вам нужно определить handleDragOnButton в вашем контроллере. В этой функции вы можете получить текущее касание и соответственно переместить кнопку, изменив frame.

 - (void)handleDragOnButton:(UIPanGestureRecognizer*)recognizer {

    if (recognizer.state == UIGestureRecognizerStateBegan) {    

        CGPoint touchLocation = [recognizer locationInView:recognizer.view];

    } else if (recognizer.state == UIGestureRecognizerStateChanged) {    

            <your logic here>

    } else if (recognizer.state == UIGestureRecognizerStateEnded) {    

            <your logic here>

        }
  }

Не забудьте release распознаватель жестов в dealloc.

контроллера.

Посмотрите также на этот документ от Apple .

Альтернативой может быть использование UIResponder 1030 *

 – touchesBegan:withEvent:
 – touchesMoved:withEvent:
 – touchesEnded:withEvent:
 – touchesCancelled:withEvent:

но я бы предложил, если вы ориентируетесь на iOS 3.1.3 и старше.

0 голосов
/ 01 августа 2013

Существует некоторый код с открытым исходным кодом, который делает именно это.

https://github.com/gmoledina/GMGridView

"Производительный Grid-View для iOS (iPhone / iPad), который позволяет сортировать виды жестами (пользователь может перемещать объекты пальцем, чтобы отсортировать их), а жесты зажимания / вращения / панорамирования позволяют пользователю играть с просмотр и переключение с просмотра ячеек на полноразмерный дисплей. "

...