2013-02-15 209 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