14

我正在尝试为 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 秒的延迟,因为那是我自己滚动表视图时。

“拉动刷新”的样子:

在此处输入图像描述

4

2 回答 2

14

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

[UIView animateWithDuration:0.5
                              delay:0.1
                            options: UIViewAnimationOptionCurveEaseOut
                         animations:^
         {
             CGRect frame = self.adBannerView.frame;

             self.adBannerView.frame = frame;
         }
                         completion:^(BOOL finished)
         {
         }];

尝试添加延迟和选项。

于 2013-02-15T18:23:00.820 回答
8

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

使用继承自的 aUIScrollView时,UITableView您无法更改它contentOffset的不是动画属性。相反,您需要使用方法setContentOffset:animated:

所以,你需要做的是:

  1. 将您的视图控制器设置为UITableView委托。我做了viewDidAppear
  2. 设置一个标志,以便您在委托中知道滚动发生是因为您触发了。
  3. 在委托方法- (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
于 2013-02-15T21:28:21.930 回答