UIView动画和完成块

Pad*_*215 14 objective-c ios

我试图将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");
                         }];
    }
}
Run Code Online (Sandbox Code Playgroud)

"完成块"永远不会输出......任何想法?

编辑:

好的,所以它与我的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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

编辑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
Run Code Online (Sandbox Code Playgroud)

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

"拉动刷新"如何看起来像:

在此输入图像描述

Gur*_*uru 14

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

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

             self.adBannerView.frame = frame;
         }
                         completion:^(BOOL finished)
         {
         }];
Run Code Online (Sandbox Code Playgroud)

尝试添加延迟和选项.


pgb*_*pgb 8

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

当使用UIScrollView,它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
Run Code Online (Sandbox Code Playgroud)