Ответ 1
У меня тоже было это, и я решил сделать это:
[UIView animateWithDuration:.25 animations:^{
self.scrollView.contentOffset = ...;
}];
Это очень странно, и мне интересно, есть ли у кого-нибудь мысли?
Я пытаюсь прокрутить 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
!
У меня тоже было это, и я решил сделать это:
[UIView animateWithDuration:.25 animations:^{
self.scrollView.contentOffset = ...;
}];
Говоря о личном опыте, эта проблема возникает, когда setContentOffset: вызывается несколько раз, прежде чем анимация имела шанс запустить.
Я не полностью отследил эту проблему, но я считаю, что проблема выглядит примерно так:
setContentOffset: анимированный вызов, который устанавливает новое значение смещения. setContentOffset: впоследствии вызывается с теми же параметрами, что отменяет анимацию. Он также отмечает, что новые параметры те же, что и старые параметры, поэтому предполагается, что ничего не нужно делать, даже если анимация еще не запущена.
Решение выше как-то разрывает этот цикл, но, возможно, меньшее решение kludgy заключается в том, чтобы поставить точки останова в коде и устранить множественные вызовы.
Трудно сказать, что вы купили код. И на самом деле, если вы говорите, что у вас есть проект, где все работает при тех же условиях, то, очевидно, условия не совпадают:) Я не мог воспроизвести проблему, но вот некоторые предположения для 2 случая:
Создание UIScrollView с помощью nib.
-(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];
}
Это работает для меня. Надеюсь, что это будет полезно.
Решение для 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);
}
);
Вы можете попробовать:
[scrollView setContentOffset:CGPointMake(240, 0) animated:YES];
Я столкнулся с той же проблемой, что и ScrollView не прокручивается. И я отключил "Использовать автоматический макет" в представлении, а затем работает ScrollView.
У меня была такая же проблема, в моем случае я также перехватил:
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {...}
Этот метод вызывается сразу после: (Он не ждет окончания анимации):
[scrollView setContentOffset:currentOff animated: YES];
Это означает, что если у вас есть какая-либо логика, которая "ждет" конца анимации, и вы перехватываете scrollViewDidEndScrollingAnimation, тогда результат будет undefined, IE: преждевременное завершение анимации.
EDIT: принятое решение/обходное решение:
[UIView animateWithDuration:.25 animations:^{
self.scrollView.contentOffset = ...;
}];
Также "работает" в моем сценарии, потому что установка contentOffset напрямую не вызывает scrollViewDidEndScrollingAnimation
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)
})
})
}