Вопрос

Я бегу в небольшую проблему в моем приложении.

У меня по сути есть серия 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 недвижимость нет.

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

enter image description here

В 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top