我有UIScrollView子类.它的内容是可重用的 - 大约有4或5个视图用于显示数百个元素(同时滚动隐藏的对象重用,并在需要查看它们时跳转到另一个位置)
我需要的是:能够自动滚动我的滚动视图到任何位置.例如,我的滚动视图显示第4,第5和第6个元素,当我点击某个按钮时,它需要滚动到第30个元素.换句话说,我需要UIScrollView的标准行为.
这很好用:
[self setContentOffset:CGPointMake(index*elementWidth, 0) animated:YES];
Run Code Online (Sandbox Code Playgroud)
但我需要一些定制.例如,更改动画持续时间,添加一些代码以在动画结束时执行.
明显的决定:
[UIView animateWithDuration:3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
[self setContentOffset:CGPointMake(index*elementWidth, 0)];
} completion:^(BOOL finished) {
//some code
}];
Run Code Online (Sandbox Code Playgroud)
但我有一些动作连接到滚动事件,所以现在它们都在动画块中,它导致所有子视图的帧也动画(感谢几个可重复使用的元素,所有这些都不是我想要的动画)
问题是:我如何制作自定义动画(实际上我需要自定义持续时间,最后操作和BeginFromCurrentState选项)以进行内容偏移而不动画连接到scrollViewDidScroll
事件的所有代码?
UPD:
感谢Andrew的回答(第一部分)我解决了内部动画的问题scrollViewDidScroll
:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
[UIView performWithoutAnimation:^{
[self refreshTiles];
}];
}
Run Code Online (Sandbox Code Playgroud)
但scrollViewDidScroll
必须(为了我的目的)执行每一帧动画,就像它的情况一样
[self setContentOffset:CGPointMake(index*elementWidth, 0) animated:YES];
Run Code Online (Sandbox Code Playgroud)
但是,现在它只在动画开始时执行一次.
我怎么解决这个问题?