2010-09-04 2 views
43

Я столкнулся с небольшой проблемой в своем приложении.Прикосновение UIButton задерживается, когда в UIScrollView

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

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

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

Любая помощь приветствуется!

Edit:

Я попытался установить delaysContentTouches в NO но прокрутка становится почти невозможно, так как большинство моих Scrollview наполнен UIButtons.

+0

Рассмотрите этот ответ вместо принятого: http://stackoverflow.com/a/19656611/378024 – galambalazs

ответ

39

Ok Я решил эту проблему путем создания подклассов UIScrollView и первостепенную touchesShouldCancelInContentView

Теперь мой UIButton, который был помечен, как 99 основных моментов должным образом и мой Scrollview прокрутки!

myCustomScrollView.h:

@interface myCustomScrollView : UIScrollView { 

} 

@end 

и myCustomScrollView.m:

@implementation myCustomScrollView 

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

     if (view.tag == 99) 
      return NO; 
     else 
      return YES; 
    } 
+6

Ничего себе, я просто наткнулся на этот ответ, и он полностью решил проблему, которую я имел. Хотел бы я дать вам +1000 очков! Огромное спасибо. –

+0

не работает в моем случае, но он очень близок к вашему. (Тестируется только на симуляторе). Возможно, это время решения. –

+0

Быстрая версия внизу, продолжайте читать ... –

25

Попробуйте установить свойство UIScrollView delaysContentTouches NO.

+1

Извините, я, вероятно, должен был быть более ясным. Если я установил задержекContentTouches в НЕТ, то сенсорный ответ немедленно. Однако прокрутка в значительной степени становится невозможной, поскольку штрихи интерпретируются как нажатия кнопок, а не фактическая прокрутка. – Jeff

+0

@Jeff Вы можете использовать 'canCancelContentTouches', чтобы разрешить прокрутку, даже если касание первоначально рассматривается как касание кнопки, пока цели отмены поддержки касания. Кнопки будут по-прежнему выделяться изначально при касании, но как только вы начнете прокручивать, будет не высвечиваться. – devios1

+0

@chaiguy Я ищу такое поведение, как вы описали, но пока не повезло. Если я устанавливаю 'delayaysContentTouches = NO' и' canCancelContentTouches = YES', я не могу прокручивать, когда касаюсь UIButton вообще. – Darrarski

0

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

У меня есть много UIButtons в пределах UIScrollView. Когда нажимается UIButton, пользователю предоставляется новый UIViewController. Если кнопка нажата и удерживается достаточно долго, кнопка покажет свое нажатое состояние. Мой клиент жаловался на то, что если вы нажмете слишком быстро, не будет показано состояние депрессии.

Мое решение: Внутри метода UIButtons 'крана, где я загрузить новую UIViewController и представить его на экране, я использую

[self performSelector:@selector(loadNextScreenWithOptions:) 
      withObject:options 
      afterDelay:0.] 

This графиков погрузки следующего UIViewController на следующем цикле обработки событий. Разрешение времени для перерисования UIButton. UIButton теперь показывает свое пониженное состояние перед загрузкой следующего UIViewController.

37

решение Джеффа не совсем работает для меня, но это похоже один делает: http://www.charlesharley.com/2013/programming/uibutton-in-uitableviewcell-has-no-highlight-state/

Не уверен, что если бы это было в случае с ответом Джеффа, но в дополнение к переопределение -touchesShouldCancelInContentView: на ваш взгляд прокрутки подклассе, вы все еще необходимо установить delaysContentTouches на NO. Наконец, вместо того, чтобы возвращать NO для ваших кнопок, вам необходимо вернуть YES. Вот пример из приведенной выше ссылки.

- (instancetype)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     self.delaysContentTouches = NO; 
    } 

    return self; 
} 

- (BOOL)touchesShouldCancelInContentView:(UIView *)view { 
    if ([view isKindOfClass:UIButton.class]) { 
     return YES; 
    } 

    return [super touchesShouldCancelInContentView:view]; 
} 

Swift версия.

override func touchesShouldCancelInContentView(view: UIView!) -> Bool { 
    if view is UIButton { 
     return true 
    } 
    return super.touchesShouldCancelInContentView(view) 
} 
+3

это работает для меня, а не для принятого ответа. Благодарю. –

+3

Отличное решение! Если вы используете построитель интерфейсов, просто выберите scrollView и снимите флажок «Задерживать контент» в инспекторе атрибутов. – Tim

+1

Работайте со мной! Благодарю. – frank

0

Раскадровка решение: Выберите вид прокрутки, откройте "Свойства Инспектор" и снимите флажок "Задержки Содержимое штрихи"

enter image description here

0

Swift 3:

scrollView.delaysContentTouches = false 
1

В Swift 3 :

import UIKit 

class ScrollViewWithButtons: UIScrollView { 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     myInit() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     myInit() 
    } 

    private func myInit() { 
     self.delaysContentTouches = false 
    } 

    override func touchesShouldCancel(in view: UIView) -> Bool { 
     if view is UIButton { 
      return true 
     } 
     return super.touchesShouldCancel(in: view) 
    } 
} 

Затем вы можете использовать это ScrollViewWithButtons в IB или в коде.

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