8 ответов:
вы можете начать с создания и прикрепления
UILongPressGestureRecognizerэкземпляр кнопки.UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)]; [self.button addGestureRecognizer:longPress]; [longPress release];а затем реализовать метод, который обрабатывает жест
- (void)longPress:(UILongPressGestureRecognizer*)gesture { if ( gesture.state == UIGestureRecognizerStateEnded ) { NSLog(@"Long Press"); } }Теперь это будет основной подход. Вы также можете установить минимальную продолжительность печати и сколько ошибок допустимо. А также обратите внимание, что метод вызывается несколько раз, если вы после распознавания жеста, так что если вы хотите сделать что-то в конце его, вам придется проверить его состояние и справиться с этим.
в качестве альтернативы принятому ответу, это может быть сделано очень легко в Xcode с помощью Interface Builder.
просто перетащите Длительное Нажатие Распознаватель Жестов С Библиотека и поместите его в верхней части кнопки, где вы хотите длительное нажатие действия.
затем подключите действие из Длительное Нажатие Распознаватель Жестов только что добавлено, чтобы ваш контроллер вида, выбрав отправителя, чтобы быть типа
UILongPressGestureRecognizer. В коде о том, чтоIBActionиспользуйте это, что очень похоже на код, предложенный в принятом ответе:на С:
if ( sender.state == UIGestureRecognizerStateEnded ) { // Do your stuff here }или Свифт:
if sender.state == .Ended { // Do your stuff here }но я должен признать, что после попытки, я предпочитаю предложение, сделанное @shengbinmeng в качестве комментария к принятому ответу, который должен был использовать:
на С:
if ( sender.state == UIGestureRecognizerStateBegan ) { // Do your stuff here }или в Свифт:
if sender.state == .Began { // Do your stuff here }разница в том, что с
Ended, вы видите эффект длительного нажатия, когда вы поднимаете палец. СBegan, вы видите эффект длительного нажатия, как только длительное нажатие поймано системой, даже до того, как вы уберете палец с экрана.
Swift версия принятого ответа
Я сделал дополнительную модификацию с помощью
UIGestureRecognizerState.Began, а не.Endedтак как это, вероятно, то, что большинство пользователей, естественно, ожидать. Попробуйте их оба и убедитесь сами.import UIKit class ViewController: UIViewController { @IBOutlet weak var button: UIButton! override func viewDidLoad() { super.viewDidLoad() // add gesture recognizer let longPress = UILongPressGestureRecognizer(target: self, action: #selector(longPress(_:))) self.button.addGestureRecognizer(longPress) } func longPress(gesture: UILongPressGestureRecognizer) { if gesture.state == UIGestureRecognizerState.began { print("Long Press") } } @IBAction func normalButtonTap(sender: UIButton) { print("Button tapped") } }
попробуйте это:
добавление кнопки в
viewDidLoad:ниже-(void)viewDidLoad { UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [btn setTag:1]; //you can set any integer value as tag number btn.title = @"Press Me"; [btn setFrame:CGRectMake(50.0, 50.0, 60.0, 60.0)]; // now create a long press gesture UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressTap:)]; [btn addGestureRecognizer:longPress]; }Теперь вызовите метод жеста, как это
-(void)longPressTap:(id)sender { UIGestureRecognizer *recognizer = (UIGestureRecognizer*) sender // Recogniser have all property of button on which you have clicked // Now you can compare button's tag with recogniser's view.tag // View frame for getting the info on which button the click event happened // Then compare tag like this if(recognizer.view.tag == 1) { // Put your button's click code here } // And you can also compare the frame of your button with recogniser's view CGRect btnRect = CGRectMake(50.0, 50.0, 60.0, 60.0); if(recogniser.view.frame == btnRect) { //put your button's click code here } // Remember frame comparing is alternative method you don't need to write frame comparing code if you are matching the tag number of button }
Я думаю, что вам нужно мое решение.
вы должны иметь этот код для одно нажатие
- (IBAction)buttonDidPress:(id)sender { NSLog("buttonDidPress"); }во-первых, добавить жест длительного нажатия на кнопку
- (void)viewWillAppear:(BOOL)animated { UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(buttonDidLongPress:)]; [self.button addGestureRecognizer:longPress]; }затем повторно вызовите одно событие нажатия, если распознается жест длительного нажатия.
- (void)buttonDidLongPress:(UILongPressGestureRecognizer*)gesture { switch (gesture.state) { case UIGestureRecognizerStateBegan: { self.timer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(buttonDidPress:) userInfo:nil repeats:YES]; NSRunLoop * theRunLoop = [NSRunLoop currentRunLoop]; [theRunLoop addTimer:self.timer forMode:NSDefaultRunLoopMode]; } break; case UIGestureRecognizerStateEnded: { [self.timer invalidate]; self.timer = nil; } break; default: break; } }
для Swift 4, "func longPress" должен быть изменен, чтобы заставить его работать:
import UIKit class ViewController: UIViewController { @IBOutlet weak var button: UIButton! override func viewDidLoad() { super.viewDidLoad() // add guesture recognizer let longPress = UILongPressGestureRecognizer(target: self, action: #selector(longPress(_:))) self.button.addGestureRecognizer(longPress) } @objc func longPress(_ guesture: UILongPressGestureRecognizer) { if guesture.state == UIGestureRecognizerState.began { print("Long Press") } } @IBAction func normalButtonTap(sender: UIButton) { print("Button tapped") } }
у меня есть подкласс UIButton для моего приложения, поэтому я вытащил свою реализацию. Вы можете добавить в свой подкласс, или это может быть перекодировано в категории UIButton.
моя цель состояла в том, чтобы добавить длительное нажатие на мою кнопку, не загромождая мои контроллеры просмотра всем кодом. Я решил, что действие должно быть вызвано, когда начинается состояние распознавания жестов.
есть предупреждение, которое выходит, что я никогда не удосужился решить. Говорит, что это возможная утечка, думал я проверил код и он не течет.
@interface MYLongButton () @property (nonatomic, strong) UILongPressGestureRecognizer *gestureRecognizer; @property (nonatomic, strong) id gestureRecognizerTarget; @property (nonatomic, assign) SEL gestureRecognizerSelector; @end @implementation MYLongButton - (void)addLongPressTarget:(CGFloat)interval target:(id)target action:(SEL)selector { _gestureRecognizerTarget = target; _gestureRecognizerSelector = selector; _gestureRecognizer = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(handleLongPressGestureRecognizer:)]; _gestureRecognizer.minimumPressDuration = interval; [self addGestureRecognizer:_gestureRecognizer]; } - (void)handleLongPressGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { NSAssert([_gestureRecognizerTarget respondsToSelector:_gestureRecognizerSelector], @"target does not respond to selector"); self.highlighted = NO; // warning on possible leak -- can anybody fix it? [_gestureRecognizerTarget performSelector:_gestureRecognizerSelector withObject:self]; } }чтобы назначить действие, добавьте эту строку в свой метод viewDidLoad.
[_myLongButton addLongPressTarget:0.75 target:self selector:@selector(longPressAction:)];действие должно быть определено как все IBActions (без IBAction).
- (void)longPressAction:(id)sender { // sender is the button }
никто не работал, поэтому я попытался написать код longpress в
IBActionили нажмите кнопку отstoryboardнаControllerвместо того, чтобы писать вviewDidLoad- (IBAction)btnClick:(id)sender { tag = (int)((UIButton *)sender).tag; // Long press here instead of in viewDidLoad UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)]; longPress.cancelsTouchesInView = NO; [sender addGestureRecognizer:longPress]; }
Comments