Можете ли вы иметь несколько распознавателей для одного и того же жестов в Swift? [Дубликат]

Я думаю, что проблема в том, что он показывает код вместо результата, так это то, что он не будет на локальном хосте. перепроверьте, какой адрес ур собирается. И отправляемся в локальный каталог файлов или на локальный хост.

из скриншота u отправил его на ур компьютер не на localhost.

"file: ///" это должен быть "localhost /"

166
задан KlimczakM 30 January 2015 в 15:53
поделиться

15 ответов

Хорошо, наконец нашел его после некоторого поиска через документы распознавания жестов.

Решением было реализовать UIGestureRecognizerDelegate и добавить следующее:

////////////////////////////////////////////////////////////
// UIGestureRecognizerDelegate methods

#pragma mark UIGestureRecognizerDelegate methods

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ([touch.view isDescendantOfView:autocompleteTableView]) {

        // Don't let selections of auto-complete entries fire the 
        // gesture recognizer
        return NO;
    }

    return YES;
}

Это. Надеюсь, это тоже поможет другим.

226
ответ дан shim 21 August 2018 в 18:33
поделиться
  • 1
    Вам также необходимо пропустить краны в текстовом поле. – Steven Kramer 21 March 2012 в 09:59
  • 2
    Благодаря другу он отлично работает. – SampathKumar 10 August 2012 в 15:53
  • 3
    Мне повезло с return ![touch.view isKindOfClass:[UITableViewCell class]]; – Josh Paradroid 21 February 2013 в 15:57
  • 4
    @Josh Это не работает, если вы нажимаете метки внутри ячейки. На самом деле ответ Джейсона работает идеально для того, что мне нужно. – William T. 2 May 2013 в 18:49
  • 5
    @Durgaprasad Чтобы отключить распознаватель жестов явно при выборе ячеек я добавил ![touch.view isEqual: self.tableView] && перед [touch.view isDescendantOfView: self.tableView], чтобы исключить сам tableView (поскольку isDescendantOfView: также возвращает YES, если аргумент- view - это представление получателя). Надежда, которая помогает другим людям, которые хотят получить тот же результат. – anneblue 4 September 2015 в 14:15

Мое дело было другим, включая uisearchbar и uitableview на self.view. Я хотел убрать клавиатуру uisearchbar, прикоснувшись к представлению.

var tapGestureRecognizer:UITapGestureRecognizer?

override func viewWillAppear(animated: Bool) {
    tapGestureRecognizer = UITapGestureRecognizer(target: self, action:Selector("handleTap:"))
}

В методах делегатов UISearchBar:

func searchBarShouldBeginEditing(searchBar: UISearchBar) -> Bool {
    view.addGestureRecognizer(tapGestureRecognizer!)
    return true
}
func searchBarShouldEndEditing(searchBar: UISearchBar) -> Bool {
    view.removeGestureRecognizer(tapGestureRecognizer!)
    return true
}

Когда пользователь затрагивает self.view:

func handleTap(recognizer: UITapGestureRecognizer) {
    sampleSearchBar.endEditing(true)
    sampleSearchBar.resignFirstResponder()
}
0
ответ дан A.G 21 August 2018 в 18:33
поделиться

Простое решение использует экземпляры UIControl в UITableViewCell для получения касаний. Вы можете добавлять любые представления с помощью userInteractionEnables == NO для UIControl для получения кранов.

1
ответ дан Andrew Romanov 21 August 2018 в 18:33
поделиться

Хотя уже поздно, и многие люди считают, что приведенные выше предложения работают нормально, я не мог заставить методы Джейсона или Тмиллигана работать.

У меня есть Static tableView с несколькими ячеями, содержащими текстовые поля, которые получают входные данные Number, используя только цифровую клавиатуру. Это было идеально для меня:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if(![touch.view isKindOfClass:[UITableViewCell class]]){

        [self.firstTF resignFirstResponder];
        [self.secondTF resignFirstResponder];
        [self.thirdTF resignFirstResponder];
        [self.fourthTF resignFirstResponder];

        NSLog(@"Touches Work ");

        return NO;
    }
    return YES;
}

Убедитесь, что вы внедрили это <UIGestureRecognizerDelegate> в ваш .h-файл.

Эта строка ![touch.view isKindOfClass:[UITableViewCell class]] проверяет, был ли задействован tableViewCell и отклоняет любую активную клавиатуру.

1
ответ дан App Dev Guy 21 August 2018 в 18:33
поделиться

Вот мое решение, которое напрямую связывает распознаватель's shouldReceiveTouch с тем, отображается ли клавиатура.

В вашем делегате распознавателя распознавания жестов:

#pragma mark - UIGestureRecognizerDelegate

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ([PFXKeyboardStateListener sharedInstance].visible) {
        return YES;
    }

    return NO;
}

И PFXKeyboardStateListener.h :

@interface PFXKeyboardStateListener : NSObject
{
    BOOL _isVisible;
}

+ (PFXKeyboardStateListener *)sharedInstance;

@property (nonatomic, readonly, getter=isVisible) BOOL visible;

@end

И PFXKeyboardStateListener.m:

static PFXKeyboardStateListener *sharedInstance;

@implementation PFXKeyboardStateListener

+ (PFXKeyboardStateListener *)sharedInstance
{
    return sharedInstance;
}

+ (void)load
{
    @autoreleasepool {
        sharedInstance = [[self alloc] init];
    }
}

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (BOOL)isVisible
{
    return _isVisible;
}

- (void)didShow
{
    _isVisible = YES;
}

- (void)didHide
{
    _isVisible = NO;
}

- (id)init
{
    if ((self = [super init])) {
        NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
        [center addObserver:self selector:@selector(didShow) name:UIKeyboardDidShowNotification object:nil];
        [center addObserver:self selector:@selector(didHide) name:UIKeyboardWillHideNotification object:nil];
    }
    return self;
}

@end

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

0
ответ дан bgfriend0 21 August 2018 в 18:33
поделиться

У меня может быть лучшее решение для добавления жесты касания к представлению таблицы, но одновременного выбора ячейки:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    if gestureRecognizer is UITapGestureRecognizer {
        let location = touch.locationInView(tableView)
        return (tableView.indexPathForRowAtPoint(location) == nil)
    }
    return true
}

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

17
ответ дан bonokite 21 August 2018 в 18:33
поделиться
  • 1
    Это решение скалывает! Очень полезно отличить ячейку от пустого поля таблицы. – Alessandro Ornano 7 October 2017 в 17:25

Использовать этот метод для делегата UIGestureRecognizer:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
       shouldReceiveTouch:(UITouch *)touch
{
  UIView *superview = touch.view;
  do {
    superview = superview.superview;
    if ([superview isKindOfClass:[UITableViewCell class]])
      return NO;
  } while (superview && ![superview isKindOfClass:[UITableView class]]);

  return superview != nil;
}
0
ответ дан cxa 21 August 2018 в 18:33
поделиться

Это мое решение, основанное на вышеприведенных ответах ... Это сработало для меня ...

//Create tap gesture for menu transparent view
UITapGestureRecognizer *rightTableTransparentViewTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(rightTableTransparentViewTapMethod:)];
[rightTableTransparentViewTap setCancelsTouchesInView:NO];
[_rightTableTransparentView addGestureRecognizer:rightTableTransparentViewTap];

- (void)rightTableTransparentViewTapMethod:(UITapGestureRecognizer *)recognizer {
    //Write your code here
}
0
ответ дан iOS 21 August 2018 в 18:33
поделиться

Самый простой способ решить эту проблему:

UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc] 
    initWithTarget:self action:@selector(tap:)];
[tapRec setCancelsTouchesInView:NO];

Это позволяет UIGestureRecognizer распознавать кран и также передавать касание следующему ответчику. Непредвиденным следствием этого метода является наличие на экране UITableViewCell экрана, который выталкивает другой контроллер вида. Если пользователь удаляет строку, чтобы закрыть клавиатуру, будут распознаны клавиатура и нажатие. Я сомневаюсь, что это то, что вы намереваетесь, но этот метод подходит для многих ситуаций.

Кроме того, расширяя ответ Роберта, если у вас есть указатель на рассматриваемый столбец, то вы можете прямо сравнить его класс вместо необходимости конвертировать в строку и надеяться, что Apple не изменит номенклатуру:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
     shouldReceiveTouch:(UITouch *)touch
{
    if([touch.view class] == tableview.class){
        return //YES/NO
    }

    return //YES/NO

}

Помните, что вы также должны объявить UIGestureRecognizer делегатом с этим кодом.

197
ответ дан KlimczakM 21 August 2018 в 18:33
поделиться
  • 1
    Спасибо, setCancelsTouchesInView меняет все :) – PostCodeism 18 November 2014 в 01:35
  • 2
    Чище, чем принятый ответ – vib 23 May 2015 в 19:24
  • 3
    Может все еще хотеть использовать isDescendantOfView вместо того, чтобы просто проверять, является ли class равным, поскольку вы можете прослушивать subview. Зависит от того, что вам нужно. – shim 16 June 2016 в 21:31
  • 4
    Это должен быть принятый ответ! – Sikander 4 September 2016 в 12:25

ВОПРОС: В моем случае проблема заключалась в том, что я изначально поместил кнопку в каждую ячейку коллекции и установил ограничения для заполнения ячейки, так что, когда ячейка была нажата, она нажала кнопку, однако функция кнопок была пуста поэтому ничего не происходило.

FIX: Я исправил это, удалив кнопку из ячейки коллекции.

0
ответ дан Marcus Levi 21 August 2018 в 18:33
поделиться

Установите cancelsTouchesInView вашего распознавателя на значение false. В противном случае он «потребляет» прикосновение для себя и не передает его в виде таблицы. Вот почему событие выбора никогда не происходит.

, например, в swift

let tapOnScreen: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "CheckTheTime")
tapOnScreen.cancelsTouchesInView = false
view.addGestureRecognizer(tapOnScreen)
52
ответ дан Mihriban Minaz 21 August 2018 в 18:33
поделиться

И для Swift (на основе ответа от @Jason):

class MyAwesomeClass: UIViewController, UIGestureRecognizerDelegate

private var tap: UITapGestureRecognizer!

override func viewDidLoad() {
   super.viewDidLoad()

   self.tap = UITapGestureRecognizer(target: self, action: "viewTapped:")
   self.tap.delegate = self
   self.view.addGestureRecognizer(self.tap)
}

// UIGestureRecognizerDelegate method
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    if touch.view?.isDescendantOfView(self.tableView) == true {
        return false
    }
    return true
}
27
ответ дан Nikolaj Nielsen 21 August 2018 в 18:33
поделиться

Аналогичное решение заключается в реализации gestureRecognizer:shouldReceiveTouch: с использованием класса представления, чтобы определить, какое действие нужно предпринять. Преимущество такого подхода состоит в том, что в области, непосредственно связанной с таблицей, нет маскирующих кранов (эти области все еще сходят с экземпляров UITableView, но не представляют собой ячейки).

У этого также есть бонус, что он работает с несколькими таблицами на одном представлении (без добавления дополнительного кода).

Предостережение: есть предположение, что Apple не будет измените имя класса.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    return ![NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"];
}
13
ответ дан Robert Altman 21 August 2018 в 18:33
поделиться
  • 1
    Я могу жить с этим предостережением. – Tudor 21 August 2012 в 13:49
  • 2
    Чтобы исключить строку имени класса, используйте эту строку return ![[touch.view.superview class] isSubclassOfClass:[UITableViewCell class]]; – Nianliang 26 December 2016 в 13:01

Я думаю, что нет необходимости писать блоки кодов, просто установите cancelsTouchesInView на false для вашего объекта жестов, по умолчанию это true, и вам просто нужно установить его false. Если вы используете UITapGesture объект в своем коде, а также с помощью UIScrollView (tableview, collectionview), установите это свойство false

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
8
ответ дан SHUBHAYAN KUNDU 21 August 2018 в 18:33
поделиться

В swift вы можете использовать это внутри

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if CheckTheTime() == true {
        // do something 
    }else{
    }
}

func CheckTheTime() -> Bool{
    return true
}
0
ответ дан Tunaki 21 August 2018 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: