попытка прокрутки - PullRequest
       2

попытка прокрутки

0 голосов
/ 13 октября 2011

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

Я попытался добавить распознаватели жестов в подкласс uiscrollview, и когда он достигает конца, он отключает прокруткувключен, что позволяет эти жесты быть пойманным.Но если пользователь пытается провести в доступном направлении, эффект прокрутки не произойдет, поскольку прокрутка отключена.то есть, когда пользователь прокручивает вправо, затем пытается прокрутить назад влево, ничего не произойдет, поскольку прокрутка была отключена, чтобы поймать возможный жест вправо.

Любые идеи о том, как отловить попыткупрокрутить в определенном направлении?Спасибо

Ответы [ 4 ]

1 голос
/ 13 октября 2011

Один из способов поймать это событие - установить для bounces свойство YES и реализовать остановленный bounce самостоятельно в подклассе scrollview.Переопределив методы setContentOffset, вы можете заменить координату, на которую он прокручивается.Когда это происходит, вы можете позволить другим вещам происходить также.

-(void)setContentOffset:(CGPoint)contentOffset
{
    CGPoint validOffset = [self validVersionOfOffset:contentOffset];

    if(contentOffset.x == validOffset.x)
    {
        [super setContentOffset:validOffset];
    }
    else
    {
        [super setContentOffset:validOffset animated:NO];
        [bounceCatchDelegate scrollViewTriedBouncing:self];
    }
}

-(void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated
{
    CGPoint validOffset = [self validVersionOfOffset:contentOffset];
    [super setContentOffset:validOffset animated:animated];
    if(contentOffset.x == validOffset.x)
    {
        [super setContentOffset:validOffset animated:animated];
    }
    else
    {
        [super setContentOffset:validOffset animated:NO];
        [bounceCatchDelegate scrollViewTriedBouncing:self];
    }
}

-(CGPoint)validVersionOfOffset:(CGPoint)offset
{
    //Prevents bouncing at the left and right:
    offset.x = fminf(offset.x, self.contentSize.width-CGRectGetWidth(self.frame));
    offset.x = fmaxf(offset.x, 0.0f);
    return offset;
}

Использование делегата - только предложение, любой вызов метода будет работать.

0 голосов
/ 18 мая 2013

В моем случае у меня был параметр contentSize для scrollView, установленный ПОСЛЕ:

    self.scrollView.minimumZoomScale = (self.scrollView.frame.size.width/self.scrollView.contentSize.width);

, что означало, что, как только пользователь начал масштабировать представление прокрутки, ударил nan и сработало исключение.

0 голосов
/ 13 октября 2011

вроде взломали что-то вместе, это не красиво, но работает

начать с отключения подпрыгивания

используя - (void) scrollViewWillBeginDragging: (UIScrollView *) scrollView {}

iпроверьте contentoffset, и если в любом конце представления прокрутки я отмечу это как так и установите подпрыгивание как на.затем в

- (void) scrollViewDidScroll: (UIScrollView *) scrollView {}

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

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{

    int t = self.contentOffset.x;
    if (t==0) {
        leftSet = YES;
        rightSet = NO;
        self.bounces = YES;
    } else if (t>=imagePosX-480) {//if scrollview reaches the end 
        rightSet = YES;
        leftSet = NO;
        self.bounces = YES;
    }

}


-(void)scrollViewDidScroll:(UIScrollView *)scrollView{

    int t = self.contentOffset.x; 

    if (t<=0) {
        if (leftSet) {
            self.bounces = NO;
            self.scrollEnabled = NO;

            //perform code i wanted here


        }


    } else if (t>=imagePosX-480) {//if scrollview reaches the end then snap back to start

        if (rightSet) {
            self.bounces = NO;
            self.scrollEnabled = NO;
            //perform code i wanted here

        }

    }
    else{
        rightSet = NO;
        leftSet = NO;
        self.bounces = NO;
    }



}

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

0 голосов
/ 13 октября 2011

Это обходной путь, но вы можете установить размер содержимого больше, чем он есть на самом деле. Затем в методе делегата scrollViewDidScroll вы можете проверить contentOffset вида scrollview. Если оно выше, чем желаемое значение, вы устанавливаете его обратно в шапку и делаете то, что хотите. Может быть, это выглядит не так хорошо визуально, но это может сработать. Трудно сказать, какова ваша цель с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...