0

我想動畫,其中UITableView已經到位,但每個UITableViewCells的子視圖(其本身包含單元格的內容視圖)是在窗口範圍之外。它在屏幕之外。當視圖加載時,單元格將從一個接一個地左至右地生成動畫,直到該框架的最右邊的x值接觸UITableView的最右邊的x值。動畫UITableViewCells一個接一個

動畫是這樣的,一旦第一個單元格起飛,第二個單元格會在第一個單元格完成它的動畫之前起飛。同樣,第三個單元在第二個單元完成動畫之前起飛。但是,我無法做到這一點,我所有的行都是一起動畫的。

-(void)animateStatusViewCells:(SupportTableViewCell *)cell 
{ 
__block CGPoint center; 
[UIView animateWithDuration:0.55 delay:0.55 options:UIViewAnimationOptionCurveEaseIn animations:^{ 
    center = cell.statusView.center; 
    center.x += (cell.frame.size.width - 20); 
    cell.statusView.center = center; 
}completion:^(BOOL success){ 
    NSLog(@"Translation successful!!!"); 
    double delayInSeconds = 2.0; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     //[self animateStatusViewCells:cell]; 
    }); 
}]; 
} 


-(void)animateSupportTableView:(UITableView *)myTableView 
{ 
    NSMutableArray *cells = [[NSMutableArray alloc] init]; 
    NSInteger count = [myTableView numberOfRowsInSection:0]; 

for (int i = 0; i < count; i++) { 
    [cells addObject:[myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]]; 
} 

for (SupportTableViewCell *cell in cells) { 

    [self animateStatusViewCells:cell]; 
    } 

} 

-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
    [self animateSupportTableView:_statusTableView]; 
} 

這裏有一個自定義的UITableViewCell的initWithStyle方法:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
if (self) { 
    // Initialization code 
    _statusView = [[UIView alloc] initWithFrame:self.frame]; 
    self.contentView.backgroundColor = [UIColor greenColor]; 
    self.contentView.alpha = 0.7; 
    CGPoint cellCenter = self.center; 
    cellCenter.x = self.center.x - (self.frame.size.width - 20); 
    _statusView.center = cellCenter; 

    [self addSubview:_statusView]; 
    [_statusView addSubview:self.contentView]; 
} 
return self; 

}

+0

'中心'應該在第一個塊內部聲明,並且你不需要'__block' – newacct

回答

3

您需要爲每個動畫使用不同的延遲值。而不是使用.55恆定的延遲,傳遞的細胞數的動畫的方法,並使用類似:

CGFloat delay = .55 + cellNumber * cellDelay; 
[UIView animateWithDuration: 0.55 delay: delay options:UIViewAnimationOptionCurveEaseIn animations: 
^{ 
    //animation code 
} 
]; 
+0

非常感謝你! – jerry

0

試試這個

聲明這個地方。

int c=0; 


-(void)animateStatusViewCells:(SupportTableViewCell *)cell 
{ 
__block CGPoint center; 
[UIView animateWithDuration:0.55 delay:0.55 options:UIViewAnimationOptionCurveEaseIn animations:^{ 
    center = cell.statusView.center; 
    center.x += (cell.frame.size.width - 20); 
    cell.statusView.center = center; 
}completion:^(BOOL success){ 
c++; 
if(c<[cells count]){ 
[self animateStatusViewCells:[cells objectAtIndex:c]]; 
} 
}]; 
} 



-(void)animateSupportTableView:(UITableView *)myTableView 
{ 
    NSMutableArray *cells = [[NSMutableArray alloc] init]; 
    NSInteger count = [myTableView numberOfRowsInSection:0]; 

for (int i = 0; i < count; i++) { 
    [cells addObject:[myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]]; 
} 

    [self animateStatusViewCells:[cells objectAtIndex:c]]; 


} 
2

爲了什麼它的價值,這是一個乾淨的解決方案:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,  forRowAtIndexPath indexPath: NSIndexPath) { 
    let trans = CATransform3DMakeTranslation(-cell.frame.size.width, 0.0, 0.0) 
    cell.layer.transform = trans 

    UIView.beginAnimations("Move", context: nil) 
    UIView.setAnimationDuration(0.3) 
    UIView.setAnimationDelay(0.1 * Double(indexPath.row)) 
    cell.layer.transform = CATransform3DIdentity 
    UIView.commitAnimations() 
}