it-swarm.com.ru

UIScrollview задерживает ContentTouches проблема

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

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

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

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

Заранее спасибо.

18
Piyush Hirpara

ОК, я решил, реализовав метод ниже:

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

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

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

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

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

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

33
Chris

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

theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches
9
lifjoy

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

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

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

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

Прикасаясь к подпредставлению scrollView, посмотрите на отметку времени и Ещё раз.

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

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

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

Вот мой код:

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

    // your embedded subview's 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
}
2
Kirill E.

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

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

self.scrollview.delaysContentTouches = NO
0
Aks