相关疑难解决方法(0)

在iOS 4.0中,为什么UIScrollView zoomToRect:animated:在动画时不触发scrollViewDidScroll或scrollViewDidZoom代理?

我需要密切监视滚动视图的比例,以便我可以根据滚动视图的动画缩放更新内容视图的元素(管理多个CALayers的子视图).

在iOS 3.1上,一切都按预期工作,我使用zoomToRect:animated:并且在动画发生时重复调用UIScrollViewDelegatescrollViewDidScroll:消息,让我根据实际缩放更新子视图元素.

iOS 4.0上的相同代码不会表现出相同的行为.当我调用zoomToRect:animated:时,委托(scrollViewDidScroll:scrollViewDidZoom)只被调用一次,这使得我的子元素被同步,直到动画结束.实际上,子元素会立即跳转然后被缩放动画捕捉到所有内容都在正确的位置.就像动画没有在子视图CALayers上获取修改一样.

我已尝试使用动画块手动动画,但情况相同,没有渐进式回调调用.我也尝试过KVO,但我不清楚如何使用UIScrollView管理的动画.

在iOS 4上是否有一种解决方法可以让我将比例值推送到我的子视图,因为UIScrollView比例是动画的?

uiscrollview uiscrollviewdelegate ios4 ios

28
推荐指数
2
解决办法
4602
查看次数

如何正确设置UIScrollView contentOffset的动画

我有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)

但是,现在它只在动画开始时执行一次.

我怎么解决这个问题?

cocoa-touch uiscrollview uiview uiviewanimation ios

18
推荐指数
3
解决办法
2万
查看次数

scrollViewDidScroll:在 UITableViewRowAnimation 上?

UITableViewRowAnimation删除一行或添加一行时使用 a时,有时如果该行位于 tableview 的极端,则表格会滚动。

然而,即使它滚动它似乎也没有调用scrollViewDidScroll:委托。

例如,我的委托中有以下代码。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    NSLog(@"Scrolling %f", scrollView.contentOffset.y);
}
Run Code Online (Sandbox Code Playgroud)

如果用户滚动,它会被调用。但是当我删除一行时:

[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
Run Code Online (Sandbox Code Playgroud)

scrollViewDidScroll:方法根本没有被调用。

有什么方法可以确保在UITableView动画时调用它吗?

谢谢!

iphone uitableview uiscrollview ios

5
推荐指数
1
解决办法
1457
查看次数