it-swarm.com.ru

UIBTutton Touch задерживается, когда в UIScrollView

Я столкнулся с небольшой проблемой в моем приложении. 

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

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

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

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

Правка:

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

47
Jeff

Хорошо, я решил это путем создания подкласса 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;
    }
40
Jeff

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

В дополнение к переопределению touchesShouldCancelInContentView в вашем подклассе представления прокрутки, вам все еще нужно установить delaysContentTouches в false. Наконец, вам нужно вернуть true вместо false для ваших кнопок. Вот модифицированный пример по ссылке выше. Как предложили комментаторы, он проверяет любой подкласс UIControl, а не UIButton специально, так что это поведение применяется к любому типу управления.

Objective-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)
}
45
jlong64

Попробуйте установить для свойства UIScrollView delaysContentTouches значение NO.

26
Vladimir

В 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 или в коде.

1
Simon Reggiani

Решение раскадровки: выберите представление прокрутки, откройте «Инспектор атрибутов» и снимите флажок «Задержки касания содержимого»

 enter image description here

1
José

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

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

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

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

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

0
Brad Goss

Свифт 3:

scrollView.delaysContentTouches = false
0
Oubaida AlQuraan