2013-02-15 152 views
12

我想动画一个tableview的偏移量下来,然后在完成块将它移回备份。但我的代码是不是在完成块做任何事情:UIView动画和完成块

-(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秒的延迟,因为这是我自己滚动表格视图时的情况。

如何 “拉刷新” 的模样:

enter image description here

+1

只是tryed的测试项目中的代码,以及“你可以在模拟器或者设备上试试这个,你使用的是哪个iOS版本,XCode版本? – jamapag 2013-02-15 19:10:31

+0

模拟器,iOS 6.1,xcode 4.6。你在'viewDidAppear:'方法中做过这个吗? – Padin215 2013-02-15 19:27:33

+1

嗯,我有相同的设置。'viewDidAppear'被调用? – jamapag 2013-02-15 19:29:11

回答

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 
+0

好吧,这个工程!虽然我不确定你为什么设置'self.tableView.delegate = self'。我没有补充说,它的工作原理。我添加了一个'[self performSelector:@selector(test)withObject:nil afterDelay:2]'并且完美,谢谢! – Padin215 2013-02-15 21:35:57

+0

+1,@pgb,很好接收。 – iDev 2013-02-15 21:54:03

+0

我设置了委托,因为我没有连接IB。我想你没有见过它,因为你的视图控制器已经是表代表。 – pgb 2013-02-15 22:48:33

13

我用这个和工作的罚款。其替代解决方案。

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

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

尝试添加延迟和选项。

+0

为什么会有所作为?还有一个'animateWithDuration:动画:完成:'方法 – 2013-02-15 18:26:55