Прикосновение UIButton задерживается, когда в UIScrollView
В моем приложении возникает небольшая проблема.
Я по существу имеет серию из UIButtons
, добавленную в виде subviews в UIScrollView
, которая является частью nib. Каждый раз, когда я нажимаю кнопку, происходит заметная задержка до того, как кнопка будет выделена. Я, по существу, должен удерживать его примерно на полсекунды, прежде чем кнопка погаснет и отобразится.
Я предполагаю, что это потому, что UIScrollView
нужно определить, является ли касание прокруткой или касанием, которое предназначено для подсмотра.
В любом случае, я немного не уверен, как действовать дальше. Я просто хочу, чтобы кнопка была выбрана, как только я ее нажал.
Любая помощь приветствуется!
Edit:
Я пробовал установить delaysContentTouches
на NO, но прокрутка становится почти невозможной, так как большая часть моего scrollView заполняется UIButtons
.
Ответы
Ответ 1
Хорошо, я решил это путем подкласса UIScrollView
и переопределения touchesShouldCancelInContentView
Теперь мой UIButton
, который был помечен как 99, подсвечивается правильно, и прокрутка прокрутки прокручивается!
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;
}
Ответ 2
Решение Jeff для меня не совсем работает, но это похожее: 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];
}
Быстрая версия.
override func touchesShouldCancelInContentView(view: UIView!) -> Bool {
if view is UIButton {
return true
}
return super.touchesShouldCancelInContentView(view)
}
Ответ 3
Попробуйте установить для свойства UIScrollView delaysContentTouches
значение NO.
Ответ 4
В 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 или в коде.
Ответ 5
Ни один из существующих решений не работал у меня. Возможно, моя ситуация более уникальна.
У меня есть много UIButtons
в пределах UIScrollView
. При нажатии кнопки UIButton
для пользователя предоставляется новый UIViewController
. Если кнопка нажата и удерживается достаточно долго, кнопка покажет свое нажатое состояние. Мой клиент жаловался, что если вы нажимаете слишком быстро, не отображается состояние нажатой.
Мое решение:
Внутри метода UIButtons
', где я загружаю новый UIViewController
и представляю его на экране, я использую
[self performSelector:@selector(loadNextScreenWithOptions:)
withObject:options
afterDelay:0.]
Это расписание загрузки следующего UIViewController
в следующем цикле событий. Разрешение времени для UIButton
для перерисовки. UIButton
теперь показывает свое пониженное состояние перед загрузкой следующего UIViewController
.
Ответ 6
Решение раскадровки: выберите вид прокрутки, откройте "Attributes Inspector" и снимите флажок "Задерживает содержимое"
![введите описание изображения здесь]()
Ответ 7
Swift 3:
scrollView.delaysContentTouches = false