UIView动画和完成块

我试图将tableview的偏移量设置为动画,然后在完成块中将其向上移动。 但我的代码在完成块中没有做任何事情:

-(void)viewDidAppear:(BOOL)animated { if (TRUE) { NSLog(@"animating table view"); [UIView animateWithDuration:.25 animations:^{ self.tableView.contentOffset = CGPointMake(self.tableView.contentOffset.x, self.tableView.contentOffset.y - 60); } completion:^(BOOL finished){ NSLog(@"completion block"); }]; } } 

“完成块”永远不会输出……任何想法?

编辑:

好的,所以它与我的UIREfreshControl有关:

 - (void)viewDidLoad { [super viewDidLoad]; if (TRUE) { UIRefreshControl *refresh = [[UIRefreshControl alloc] init]; refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"]; [refresh addTarget:self action:@selector(refreshTableView:) forControlEvents:UIControlEventValueChanged]; [self setRefreshControl:refresh]; } } 

添加刷新控件时,它不会触发完成块。 如果我不添加控件,它按预期工作。

编辑2:

K,所以如果我滚动表视图,则会触发完成块:

 2013-02-15 13:37:06.266 [1922:14003] animating table view 2013-02-15 13:37:14.782 [1922:14003] completion block 

写入的代码应该在“动画表视图”之后立即记录“完成块”,但是当我自己滚动表视图时它有8秒的延迟原因。

“拉动刷新”如何看起来像:

在此处输入图像描述

我能够重现这个问题并找到了解决方法。

当使用UIScrollViewUITableViewinheritance自UIScrollView ,您无法更改其contentOffset不是可动画的属性。 相反,您需要使用方法setContentOffset:animated: .

那么,你需要做的是如下:

  1. 将视图控制器设置为UITableView委托。 我在viewDidAppear上做了。
  2. 设置一个标志,因此您在委托中知道滚动发生是因为您已触发。
  3. 在委托方法- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView ,弹回动画(你可以在这里使用performSelector:afterDelay:添加延迟performSelector:afterDelay: .

这是代码:

 @interface MyViewController () @property (assign, nonatomic) BOOL shouldReturn; @end @implementation MyViewController -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; if (TRUE) { NSLog(@"animating table view"); self.shouldReturn = YES; self.tableView.delegate = self; [self.tableView setContentOffset: CGPointMake(self.tableView.contentOffset.x, self.tableView.contentOffset.y - 60) animated:YES]; } } - (void)viewDidLoad { [super viewDidLoad]; if (TRUE) { UIRefreshControl *refresh = [[UIRefreshControl alloc] init]; refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"]; [refresh addTarget:self action:@selector(refreshTableView:) forControlEvents:UIControlEventValueChanged]; [self setRefreshControl:refresh]; } } - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { if (self.shouldReturn) { self.shouldReturn = NO; [self.tableView setContentOffset:CGPointZero animated:YES]; } } @end 

我用这个并且工作正常。 其替代解决方案。

 [UIView animateWithDuration:0.5 delay:0.1 options: UIViewAnimationOptionCurveEaseOut animations:^ { CGRect frame = self.adBannerView.frame; self.adBannerView.frame = frame; } completion:^(BOOL finished) { }]; 

尝试添加延迟和选项。