我正在尝试像Peek Calendar一样创建UITableCellView动画。从这里可以看出:
我正在使用UITableView和以下动画代码
//Animaiton for the table view cells to appear
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if([cell.reuseIdentifier isEqualToString:@"HolidayCell"]) {
int x = (indexPath.row-self.selectedMonth) %2;
//1. Setup the CATransform3D structure
CATransform3D rotation;
CATransform3D position;
position = CATransform3DMakeTranslation(0, -36, 0) ;
//rotation.m33 = 12;
UILabel *shadow = (UILabel*)[cell.contentView viewWithTag:2];
//2. Define the initial state (Before the animation)
cell.alpha = 1;
shadow.alpha = 0.75;
if(x==1) {
rotation = CATransform3DMakeRotation((-90.0*M_PI)/180, 1.5, 0.0, 0.0);
rotation.m34 = 0.0059;
cell.layer.anchorPoint = CGPointMake(0.5, 0.0);
}
else
{
rotation = CATransform3DMakeRotation((90.0*M_PI)/180, 1.5, 0.0, 0.0);
rotation.m34 = 0.0059;
cell.layer.anchorPoint = CGPointMake(0.5, 1.0);
}
cell.layer.transform = CATransform3DConcat(position, rotation);
//3. Define the final state (After the animation) and commit the animation
[UIView beginAnimations:@"rotation" context:NULL];
[UIView setAnimationDuration:2.3];
//[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:cell cache:YES];
cell.layer.transform = CATransform3DIdentity;
cell.alpha = 1;
shadow.alpha = 0;
//cell.layer.shadowOff
1. List item
set = CGSizeMake(0, 0);
[UIView commitAnimations];
}
}
现在我对动画没有任何特别的问题。细胞旋转得很好。然而我的问题是,当我插入一个单元格时,即使在旋转时它仍然占用空间,就像它完全打开一样。
正如你所看到的那样,细胞在“虚拟盒子”中旋转,但我希望细胞粘在一起,如图所示:
有没有人知道如何做到这一点?
答案 0 :(得分:0)
您没有变换帧,只变换图层。该图层仅是单元格的可视化表示,并不定义单元格的大小或位置。
我相信,在tableView中,单元格的框架首先由heightForRowAtIndexPath:
方法定义,但您应该可以使用“frame”属性更改并为其设置动画。尝试将其设置为零,并在单元格出现时设置为最终高度。
代码,终于给出了解决方案:https://www.cocoacontrols.com/controls/jtgesturebasedtableviewdemo
答案 1 :(得分:0)
这是一些实际可行的代码(经过测试)。
把它放入
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
方法,并注释掉其他代码以进行测试
CGRect cellFrame = cell.frame;
//replace with the y coordinate of the point, where the cell(s) get inserted
float insertPoint = 0;
//replace with the duration you wish
float animationDuration = 5;
[cell setFrame:CGRectMake(cellFrame.origin.x, insertPoint, cellFrame.size.width, 0)];
[UIView animateWithDuration:animationDuration animations:^{
[cell setFrame:cellFrame];
}];
这可能不是你想要的,但它应该给你一个想法......