Ответ 1
OK Я решил, выполнив ниже метод:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
NSLog(@"touchesShouldCancelInContentView");
if ([view isKindOfClass:[UIButton class]])
return NO;
else
return YES;
}
У меня есть UIScrollView
, загруженный с помощью UIButtons
и в UIButton
, я выделил UIImage
для каждого UIButton
.
Если я не установил delaysContentTouches
как NO
, то выделенное UIImage
из UIButton
не будет отображаться, если я очень быстро прикоснусь к UIButton
. После того как я установил свойство delaysContentTouches
как NO
, будет показано только UIButton
выделенное UIImage
.
Теперь после установки свойства delaysContentTouches
как НЕТ для UIScrollView
. Я не могу прокрутить UIScrollView
, перетащив UIButtons
. Теперь, как я могу решить эту проблему.
Пожалуйста, дайте мне совет.
Спасибо заранее.
OK Я решил, выполнив ниже метод:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
NSLog(@"touchesShouldCancelInContentView");
if ([view isKindOfClass:[UIButton class]])
return NO;
else
return YES;
}
Вот что работает для меня. Подкласс UIScrollView и реализовать только этот метод:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
return YES;
}
Затем установите delaysContentTouches = NO;
Voila! Работает так же, как и на главном экране: сразу выделяет кнопки, но позволяет прокручивать:)
Я обнаружил, что в iOS 8 UIScrollView, лежащий в основе UIPanGestureRecognizer, не соблюдает свойство UIScrollView delayaysContentTouches. Я считаю это ошибкой iOS 8. Вот мой способ:
theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches
Невозможно найти удовлетворительное решение онлайн до сих пор (и, похоже, 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
}
У меня была такая же проблема и одинаковая иерархия представлений. С последним sdk просто используйте его:
Установка задержекContentTouches для NO для UIButton в том же UITableViewCell.
self.scrollview.delaysContentTouches = NO
Создайте подкласс UIScrollView (или UITableView, или UICollectionView, или любого другого используемого вами подкласса UIScrollView).
Реализуйте следующий метод:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
if ([view isKindOfClass:UIButton.class]) {
return YES;
}
return [super touchesShouldCancelInContentView:view];
}
Установите этот подкласс в xib/storyboard как класс "Пользовательский класс", если вы используете конструктор интерфейса.
Снимите флажок " Delay Touch Down
в xib или установите в delaysContentTouches = NO
.