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

Проблема с uiscrollview setcontentoffset анимированная, не прокручиваемая при анимировании: yes установлен

Это очень странно, и мне интересно, есть ли у кого-нибудь мысли?

Я пытаюсь прокрутить UIScrollView в ответ на нажатие кнопки на iPad.

Если я это сделаю:

CGPoint currentOff = scrollView.contentOffset;
currentOff.x+=240;
[scrollView setContentOffset:currentOff animated: NO];

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

CGPoint currentOff = scrollView.contentOffset;
currentOff.x+=240;
[scrollView setContentOffset:currentOff animated: YES];

Тогда это ничего не делает! У меня есть другой режим прокрутки, который работает правильно и отвечает на setContentOffset:YES, как и ожидалось, поэтому я очень озадачен. Любые идеи о том, почему прокрутка может не произойти, приветствуются!

Кроме того, - (void)scrollViewDidScroll:(UIScrollView *)sender вообще ничего не получает, когда используется animated:YES, но вызывается, когда используется animated:NO!

4b9b3361

Ответ 1

У меня тоже было это, и я решил сделать это:

[UIView animateWithDuration:.25 animations:^{
    self.scrollView.contentOffset = ...;
}];

Ответ 2

Говоря о личном опыте, эта проблема возникает, когда setContentOffset: вызывается несколько раз, прежде чем анимация имела шанс запустить.

Я не полностью отследил эту проблему, но я считаю, что проблема выглядит примерно так:

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

Решение выше как-то разрывает этот цикл, но, возможно, меньшее решение kludgy заключается в том, чтобы поставить точки останова в коде и устранить множественные вызовы.

Ответ 3

Трудно сказать, что вы купили код. И на самом деле, если вы говорите, что у вас есть проект, где все работает при тех же условиях, то, очевидно, условия не совпадают:) Я не мог воспроизвести проблему, но вот некоторые предположения для 2 случая:

  • Создание UIScrollView с помощью nib.

    • Не забудьте создать IBOutlet и связать его с элементом scrollView в nib. В простом представлении на основе приложения сразу после этого я получил scrollView, работающий так, как вы хотели в анимированном: и YES, и NO. Но чтобы сделать работу

    -(void)scrollViewDidScroll:(UIScrollView *)sender; вы должны установить делегат:

yourScrollView.delegate = self;

где "self" является классом, где у вас есть функция scrollViewDidScroll; btw этот класс должен соответствовать протоколу UIScrollViewDelegate.

2.Создание объекта UIScrollView вручную.

  • здесь идея в основном такая же, поэтому я просто предоставил простой код:

    -(void) creatingScrollView {
        UIScrollView *newScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(20, 5, 280, 44)];
        newScroll.pagingEnabled = YES;
        newScroll.showsVerticalScrollIndicator = NO;
        newScroll.showsHorizontalScrollIndicator = NO;
    
        // ... some subviews being added to our scroll view
    
        newScroll.delegate = self;
        [self.view addSubview:newScroll];
        [newScroll release];
    }
    

Это работает для меня. Надеюсь, что это будет полезно.

Ответ 4

Решение для Xamarin.iOS

InvokeOnMainThread(() =>
{
  scrollView.SetContentOffset(new PointF((page * UIScreen.MainScreen.Bounds.Width), 0), true);
});

Это также можно решить, используя UIView.Animate

UIView.Animate(
    duration: .25,
    animation: () =>
    {
       scrollView.SetContentOffset(new PointF((value * UIScreen.MainScreen.Bounds.Width), 0), true);
    }
);

Ответ 5

Вы можете попробовать:

[scrollView setContentOffset:CGPointMake(240, 0) animated:YES];

Ответ 6

Я столкнулся с той же проблемой, что и ScrollView не прокручивается. И я отключил "Использовать автоматический макет" в представлении, а затем работает ScrollView.

Ответ 7

У меня была такая же проблема, в моем случае я также перехватил:

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {...}

Этот метод вызывается сразу после: (Он не ждет окончания анимации):

[scrollView setContentOffset:currentOff animated: YES];

Это означает, что если у вас есть какая-либо логика, которая "ждет" конца анимации, и вы перехватываете scrollViewDidEndScrollingAnimation, тогда результат будет undefined, IE: преждевременное завершение анимации.

EDIT: принятое решение/обходное решение:

[UIView animateWithDuration:.25 animations:^{
    self.scrollView.contentOffset = ...;
}];

Также "работает" в моем сценарии, потому что установка contentOffset напрямую не вызывает scrollViewDidEndScrollingAnimation

Ответ 8

func scrollViewDidScroll(scrollView: UIScrollView) {

    dispatch_async(dispatch_get_main_queue(),{

        UIView.animateWithDuration(0.10, animations: { () -> Void in

            let loginScrollViewCurrentPosition:CGPoint = CGPointMake(self.loginScrollView.contentOffset.x, self.loginScrollView.contentOffset.y) as CGPoint
            self.loginScrollView.setContentOffset(loginScrollViewCurrentPosition, animated: true)

            })
    })

}