Поскольку 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 и старше.