2013-09-25 4 views
9

У меня есть UIControl внутри UIScrollView. В моем UIControl init я настраиваю некоторые обработчики событий касания, например.Предотвращение событий касания на подпрограммах прокрутки UIScrollView в iOS7

[self addTarget:_delegate 
     action:@selector(touchedDown) forControlEvents:UIControlEventTouchDown]; 

iOS6 и iOS7 ведут себя по-разному, когда я делаю следующее:

  1. Проведите по считывателю UIScrollView, чтобы начать прокрутку
  2. Нажмите UIScrollView чтобы остановить прокрутку

В iOS6, мое приложение продолжает вести себя так, как планировалось: кран на шаге № 2 не звонитьtouchedDown - UAScrollView swallo ws событие касания, так как оно немедленно прекращает прокрутку.

Но в iOS7 UIScrollView прекращает прокрутку, как ожидалось, а touchedDownпо-прежнему называется.

Было ли зарегистрированное изменение API? Я хочу, чтобы мое приложение вел себя одинаково с iOS6 в iOS7.

+1

же здесь с UIButtons на UIScrollView. В iOS6 вы можете прокручивать UIScrollView, хватая кнопку, и UIControlEventTouchDown не будет вызываться на кнопке. В iOS7 вызывается UIControlEventTouchDown. – Wizfinger

ответ

2

Не очень элегантный, но в отсутствие каких-либо лучших идей, вот что сейчас работает для меня:

  • На UIScrollView, установите canCancelContentTouches в YES и delaysContentTouches к NO.
  • В UIScrollViewDelegate переключите userInteractionEnabled свойство подвида в этой UIScrollView, когда в UIScrollView свитка:
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    [_contentView setUserInteractionEnabled:NO]; 
} 

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if (!decelerate) { 
     [_contentView setUserInteractionEnabled:YES]; 
    } 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    [_contentView setUserInteractionEnabled:YES]; 
} 
  • подкласс UIScrollView и реализации:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view 
{ 
    return YES; 
} 
  • подклассы UIControl и осуществлять touchesCancelled:withEvent отменить независимо от UIControlEventTouchDown обработчик делает:
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    //custom logic 
} 
0

же здесь с UIButtons на UIScrollView. На данный момент это мое решение.

Вместо того, чтобы использовать содержимое UIControlEventTouchDown событие:

[button addTarget:_delegate 
     action:@selector(touchedDown) forControlEvents:UIControlEventTouchDown]; 

я реализовал метод UIResponder touchesEnded в моем содержании UIViewController:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
// my scroll content touch logic 
} 

Если пользователь прикасается содержание и начинает перетаскивание обработчик touchesEnded будет не называть. Метод UIRsponder касается метода «Отмена».

Если пользователь не перетаскивает UIscrollview, запускается обработчик touchesEnded, который может использоваться для сенсорной логики.

4

Просто замените тип события

UIControlEventTouchDown должен быть UIControlEventTouchUpInside

+0

На самом деле, это замечательно! Я смотрел на сложные решения, такие как внедрение hitTest, но это все, что мне нужно. (Хотя это на самом деле не ответ на начальный вопрос) – jeppeb

+0

отлично, это то, что я ищу :) – Jacky

8

Обойти прошивкой 7

@interface UIScrollViewFixed : UIScrollView 

@end 

@implementation UIScrollViewFixed 

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    if (self.isDragging || self.isDecelerating) { 
     return self; 
    } 
    return [super hitTest:point withEvent:event]; 
} 

@end 
+0

Отлично подходит для iPhone, а не iPad. – chrysAllwood

Смежные вопросы