Uibutton Touch задерживается, когда в UiscrollView
-
30-09-2019 - |
Вопрос
Я бегу в небольшую проблему в моем приложении.
У меня по сути есть серия UIButtons
добавлено в виде субвезгов в UIScrollView
который является частью ниб. Каждый раз, когда я нажимаю на кнопку, есть заметная задержка, прежде чем кнопка выделена. Мне по существу, приходится удерживать его в течение почти полторы до появления кнопки и отображается выбрана.
Я предполагаю, что это потому, что UIScrollView
Необходимо определить, является ли прикосновение прокрутки или, если это прикосновение, которое предназначено для подзваношения.
В любом случае, я немного не уверен, как продолжить. Я просто хочу, чтобы кнопка появилась выбранная, как только я нажмею ее.
Любая помощь ценится!
Редактировать:
Я пробовал настроить delaysContentTouches
к НЕТ Но прокрутка становится практически невозможной, так как большинство моего ScrollView заполнено UIButtons
.
Решение 2
Хорошо, я решил это по подклассам 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;
}
Другие советы
Решение Джеффа не было вполне работать для меня, но это похожее делает: http://charlesharley.com/2013/programming/uibutton-in-inuitableviewcell-has-no-highthlight-state.
В дополнение к переопределению touchesShouldCancelInContentView
В своем подклассе просмотров просмотра вам все еще нужно установить delaysContentTouches
к false
. Отказ Наконец, вам нужно вернуться true
скорее, чем false
для ваших кнопок. Вот модифицированный пример из вышеуказанной ссылки. Как предложены комментаторы, он проверяет любой подкласс UIControl
скорее, чем UIButton
В частности, так что это поведение относится к любому типу управления.
Объектив-C:
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.delaysContentTouches = false;
}
return self;
}
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
if ([view isKindOfClass:UIControl.class]) {
return true;
}
return [super touchesShouldCancelInContentView:view];
}
Swift 4:
override func touchesShouldCancel(in view: UIView) -> Bool {
if view is UIControl {
return true
}
return super.touchesShouldCancel(in: view)
}
Попробуйте установить UiscrollView delaysContentTouches
недвижимость нет.
В 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 или в коде.
Ни один из существующих решений не работал для меня. Может быть, моя ситуация более уникальна.
у меня много UIButtons
в пределах UIScrollView
. Отказ Когда UIButton
нажал новый UIViewController
представлен пользователю. Если кнопка нажата и удерживается достаточно длинной, кнопка покажет свое депрессивное состояние. Мой клиент жаловался, что если вы постучите слишком быстро, не показано депрессивное состояние.
Мое решение: внутри UIButtons
«Подключить метод, где я загружаю новый UIViewController
и представлять его на экране, я использую
[self performSelector:@selector(loadNextScreenWithOptions:)
withObject:options
afterDelay:0.]
Это расписание загрузки следующего UIViewController
на следующей петле событий. Допустить время для UIButton
перерезать. То UIButton
теперь показывает свое подавленное состояние перед загрузкой следующего UIViewController
.
Swift 3:
scrollView.delaysContentTouches = false