我正在尝试为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,所以如果我滚动表格 View ,则会触发完成块:
2013-02-15 13:37:06.266 [1922:14003] animating table view
2013-02-15 13:37:14.782 [1922:14003] completion block

编写的代码应在“动画表 View ”之后立即记录“补全块”,但是它有8秒钟的延迟原因,这就是我自己滚动表 View 时的原因。

“刷新”的外观如下:

最佳答案

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

使用UIScrollView继承的UITableView时,您不能更改其contentOffset不是可动画设置的属性。相反,您需要使用setContentOffset:animated:方法。

因此,您需要做的如下:

  • 将您的 View Controller 设置为UITableView委托(delegate)。我在viewDidAppear上做了。
  • 设置一个标志,这样您就可以在委托(delegate)中知道滚动是由于触发而发生的。
  • 在委托(delegate)方法- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView中,使动画反弹(您可以在此处通过使用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
    

    10-05 20:21
    查看更多