scrollViewDidEndDecelerating вызывается для простого прикосновения

Я реализую UIScrollViewDelegate и много чего делаю с ним. Однако я только что обнаружил неприятную проблему.

Я ожидаю, что scrollViewDidEndDecelerating: будет вызываться всегда после scrollViewWillBeginDecelerating:. Однако, если я просто касаюсь своего ScrollView (на самом деле я касаюсь кнопки внутри scrollView), вызывается scrollViewDidEndDecelerating:, а scrollViewWillBeginDecelerating: не вызывается.

Итак, как мне избежать вызова scrollViewDidEndDecelerating:, когда я просто нажимаю кнопку внутри своего UIScrollView?

Спасибо!


person LocoMike    schedule 30.11.2011    source источник
comment
какое-нибудь решение для этого?   -  person Neha    schedule 19.07.2017


Ответы (2)


Создайте член BOOL с именем buttonPressed или аналогичный и инициализируйте его значением false в вашем init: методе.

Установите для BOOL значение true всякий раз, когда нажимаются ваши кнопки, а затем выполните следующую проверку:

-(void)scrollViewDidEndDecelerating: (UIScrollView*)scrollView
{
    if (!buttonPressed)
    {
        // resume normal processing
    }
    else
    {
        // you will need to decide on the best place to reset this variable.
        buttonPressed = NO;
    }
}
person Luke    schedule 01.12.2011
comment
Эй, да, это один из возможных ответов. Однако я действительно хочу, чтобы этот метод не вызывался, особенно когда не вызывается scrollViewWillBeginDecelerating:. F Для такого рода взлома, я думаю, было бы более полезно выполнять действие кнопки с небольшой задержкой, чтобы прикосновения были завершены. Также я не могу точно знать, что именно моя кнопка вызвала вызов этого метода, поэтому я никогда не мог быть уверен, сбрасываю ли я эту переменную в правильное место ... :( - person LocoMike; 01.12.2011
comment
Похоже, вы хотели взломать ответ, но ладно. Я бы еще раз взглянул на описания методов делегата в справочнике по классу, настроил все методы, которые вы указали в своем вопросе, и понял, как / почему / когда все они вызываются. Кроме того, если вы установите теги для своих кнопок и реализуете метод отправителя - (void) buttonPressed: (id), вы сможете более эффективно реагировать на уникальное нажатие кнопки. - person Luke; 01.12.2011
comment
С помощью кнопки я обнаружил проблему. Но сама проблема в том, что scrollViewDidEndDecelerating: * вызывается при простом нажатии кнопки внутри scrollview. Нет замедления, нет willBeginDragging: ... В любом случае спасибо за ваши усилия. Возможно, этот метод вызывается каждый раз, когда вы просто нажимаете scrollView, даже если вы нажали внутреннее представление, которое будет касаться (например, UIButton) - person LocoMike; 01.12.2011

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

var currentPage : CGFloat = 0.0
var oldPage : CGFloat = 0.0

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView){
    // Test the offset and calculate the current page after scrolling ends

    let pageWidth:CGFloat = scrollView.frame.width
    let currentPage:CGFloat = floor((scrollView.contentOffset.x-pageWidth/2)/pageWidth)+1
    // Change the indicator
    print("that's the self.currentPage \(self.currentPage) and that's the current : \(currentPage)")

    guard  self.currentPage != currentPage else { return }
    oldPage = self.currentPage
    self.currentPage = currentPage;

    print("that's the old \(oldPage) and that's the current : \(currentPage)")

       //Do something
}
person killvak    schedule 28.07.2017