Подтвердить что ты не робот

Прикосновение UIButton задерживается, когда в UIScrollView

В моем приложении возникает небольшая проблема.

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

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

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

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

Edit:

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

4b9b3361

Ответ 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