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例:
-
使用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) }) }) }