uiscrollview的问题setcontentoffsetanimation时不animation:设置为yes

这很奇怪,我想知道有没有人有任何想法?

我试图滚动一个UIScrollView来响应iPad上的一个button。

如果我做:

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:在animation有机会运行之前被多次调用时,会发生此问题。

我还没有完全追查这个问题,但我相信问题是这样的:

setContentOffset:设置新的偏移值的被调用的animation。 setContentOffset:随后用相同的参数调用,取消animation。 它还注意到,新参数与旧参数相同,因此即使animation还没有运行,也不需要做任何事情。

上面的解决scheme以某种方式打破了这个循环,但是可能更less的解决方法是在代码中放置断点并消除多个调用。

很难说,你给了那段代码。 事实上,如果你说,你有一个项目,在一切工作在相同的条件下,那么显然条件是不一样的:)我不能重现这个问题,但这里有一些假设2例:

  1. 使用nib创buildUIScrollView。

    • 请不要忘记创buildIBOutlet并将其绑定到nib中的scrollView元素。 在一个简单的视图基础的应用程序之后,我得到了scrollView的工作,你想animation:都是和不。 但要做工作

    -(void)scrollViewDidScroll:(UIScrollView *)sender; 您必须设置委托:

yourScrollView.delegate = self;

其中'自我'是类,你有你的scrollViewDidScroll函数; 顺便说一下,这个类必须符合“UIScrollViewDelegate”协议。

2.手动创buildUIScrollView对象。

  • 这里的想法基本相同,所以我只提供一些简单的代码:

     -(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的解决scheme

 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]; 

我面临着同样的问题,滚动视图不滚动。 我禁用视图上的“使用自动布局”,然后滚动视图工作。

我有同样的问题,在我的情况下,我也拦截:

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

这个方法在之后立即调用:(不等到animation结束):

 [scrollView setContentOffset:currentOff animated: YES]; 

这意味着如果你有任何逻辑“等待”animation的结尾,并且你拦截了scrollViewDidEndScrollingAnimation,那么结果将是未定义的,IE:提前结束animation。

编辑:接受的解决scheme/解决方法:

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

在我的scheme中也是“有效”,因为直接设置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) }) }) }