Подтвердить что ты не робот

Задержка UIScrollviewContentTouches

У меня есть UIScrollView, загруженный с помощью UIButtons и в UIButton, я выделил UIImage для каждого UIButton.

Если я не установил delaysContentTouches как NO, то выделенное UIImage из UIButton не будет отображаться, если я очень быстро прикоснусь к UIButton. После того как я установил свойство delaysContentTouches как NO, будет показано только UIButton выделенное UIImage.

Теперь после установки свойства delaysContentTouches как НЕТ для UIScrollView. Я не могу прокрутить UIScrollView, перетащив UIButtons. Теперь, как я могу решить эту проблему.

Пожалуйста, дайте мне совет.

Спасибо заранее.

4b9b3361

Ответ 1

OK Я решил, выполнив ниже метод:

- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
    NSLog(@"touchesShouldCancelInContentView");

    if ([view isKindOfClass:[UIButton class]])
        return NO;
    else
        return YES;
}

Ответ 2

Вот что работает для меня. Подкласс UIScrollView и реализовать только этот метод:

- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
    return YES;
}

Затем установите delaysContentTouches = NO;

Voila! Работает так же, как и на главном экране: сразу выделяет кнопки, но позволяет прокручивать:)

Ответ 3

Я обнаружил, что в iOS 8 UIScrollView, лежащий в основе UIPanGestureRecognizer, не соблюдает свойство UIScrollView delayaysContentTouches. Я считаю это ошибкой iOS 8. Вот мой способ:

theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches

Ответ 4

Невозможно найти удовлетворительное решение онлайн до сих пор (и, похоже, Apple игнорирует эту проблему). Найденный поток на форуме разработчиков Apple с некоторыми предложениями, которые могут помочь: UIScrollView: 'delayaysContentTouches' игнорируется

Мне удалось использовать обходной путь из этой ссылки. Подводя итог обходному пути (я цитирую здесь пара):

Объекты UIEvent содержат отметку времени.

Вы можете записать временную метку во время касания на своей встроенный subview.

В контактахПомощью подпрограммы scrollView, посмотрите на метку времени и местоположение снова.

Если касание не сдвинулось очень далеко и больше, скажем, 0,1 секунды прошли, вы можете предположить, что пользователь коснулся подсмотра, а затем отложенное движение.

В этом случае UIScrollView самостоятельно определит, что это НЕ прокручивающее действие, хотя оно никогда не скажет вам что.

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

Здесь мой код:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    // store the timestamp
    _beginDragTimeStamp = event.timestamp;    

    // your embedded subview touches begin code
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
   // compare and ignore drag if time passed between tap and drag is less than 0.5s
   if(event.timestamp - _beginDragTimeStamp < 0.5) return;

   // your drag code
}

Ответ 5

У меня была такая же проблема и одинаковая иерархия представлений. С последним sdk просто используйте его:

Установка задержекContentTouches для NO для UIButton в том же UITableViewCell.

self.scrollview.delaysContentTouches = NO

Ответ 6

  1. Создайте подкласс UIScrollView (или UITableView, или UICollectionView, или любого другого используемого вами подкласса UIScrollView).

  2. Реализуйте следующий метод:

    - (BOOL)touchesShouldCancelInContentView:(UIView *)view {
    
         if ([view isKindOfClass:UIButton.class]) {
    
              return YES;
         }
    
         return [super touchesShouldCancelInContentView:view];
    }
    
  3. Установите этот подкласс в xib/storyboard как класс "Пользовательский класс", если вы используете конструктор интерфейса.

  4. Снимите флажок " Delay Touch Down в xib или установите в delaysContentTouches = NO.