UITableview剖面视图上的UI按钮不动画

时间:2013-05-05 10:52:25

标签: ios objective-c uitableview cabasicanimation

我正在制作一个包含主要类别和子类别的tableview。基本上主要的类别是tableview部分标题,当用户点击tableview部分标题中的按钮时,我设置我的tableview以在tableview中显示这些子类别(行)。

一切都很好,但我想要做的是当用户点击节标题中的“显示子类别按钮”时,我希望该按钮动画并旋转90度。按钮是UIButtonTypeDetailDisclosure类型,所以我想你得到了我想要的。

当我将动画代码添加到我的“viewForHeaderInSection”委托方法时,动画会起作用,但它不能从外部起作用。奇怪的是点击动作也有效。继承代码(只是为了清楚起见,用户也可以点击主要类别,用手势识别器显示该类别中的所有内容):

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{

MainCategory* cat = [self.tableViewArray objectAtIndex:section];

UIView* view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 44)];
UILabel* label = [[UILabel alloc]initWithFrame:CGRectMake(55, 0, 300, 44)];
UIView* imageView = [[UIView alloc]initWithFrame:CGRectMake(2, 2, 40, 40)];
imageView.backgroundColor = [UIColor darkGrayColor];
view.backgroundColor = [UIColor lightTextColor];
label.text = cat.name;
label.backgroundColor = [UIColor clearColor];
[view addSubview:label];
[view addSubview:imageView];
UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(selectMainCategory:)];
[view addGestureRecognizer:tapGesture];
view.tag = section;
if([cat.subcategories count]>0){
    UIButton* button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    button.frame = CGRectMake(200, 0, 44, 44);
    button.tag = section;
    [button addTarget:self action:@selector(subCategoryClick:) forControlEvents:UIControlEventTouchUpInside];
    [view addSubview:button];
}
return view;
}

我的按钮点击操作:

- (IBAction)subCategoryClick:(UIButton*)sender{

    NSLog(@"click!");
    MainCategory* cat = [tableViewArray objectAtIndex:sender.tag];
    NSNumber* section = [NSNumber numberWithInt:sender.tag];
    if(![openSections containsObject:section]){
        [openSections addObject:section];


        NSMutableArray* indexPathsToAdd = [NSMutableArray array];
        for(int i = 0;i<[cat.subcategories count];i++){
            [indexPathsToAdd addObject:[NSIndexPath indexPathForRow:i inSection:sender.tag]];
        }
        [self.tableView beginUpdates];
        [self.tableView insertRowsAtIndexPaths:indexPathsToAdd withRowAnimation:UITableViewRowAnimationAutomatic];
        [self.tableView endUpdates];
        [self rotateButton:sender isOpeningSection:YES];

    }else{
        [openSections removeObject:section];

        NSMutableArray* indexPathsToRemove = [NSMutableArray array];
        for(int i = 0;i<[cat.subcategories count];i++){
            [indexPathsToRemove addObject:[NSIndexPath indexPathForRow:i inSection:sender.tag]];
        }
        [self.tableView beginUpdates];
        [self.tableView deleteRowsAtIndexPaths:indexPathsToRemove withRowAnimation:UITableViewRowAnimationAutomatic];
        [self.tableView endUpdates];

        [self rotateButton:sender isOpeningSection:NO];
    }
    [self.tableView reloadData];
}

最后,我的动画方法(只是为了看它是动画,而不是最终方法):

- (void)rotateButton:(UIButton*)button isOpeningSection:(BOOL)isOpen{
    CABasicAnimation *halfTurn;
    halfTurn = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    halfTurn.fromValue = [NSNumber numberWithFloat:0];
    halfTurn.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)];
    halfTurn.duration = 0.5;
    halfTurn.repeatCount = HUGE_VALF;
    [[button layer] addAnimation:halfTurn forKey:@"180"];
}

正如我所说,当我将旋转按钮内容添加到viewForSection方法时,按钮正在旋转,但是当从lick事件调用时它不会旋转。我想我在这个方法中瞄准了错误的按钮层..

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

360 * PI / 180 = 2PI。这是360度。使用M_PI / 2。

答案 1 :(得分:1)

我猜想调用reloadData会强制表视图从tableView:viewForHeaderInSection:创建一个新视图,它会立即从视图层次结构中删除旧视图,并将未旋转的视图添加回来。

可能的解决方案:

  • 如果您已经在insertRowsAtIndexPathsdeleteRowsAtIndexPaths中制作动画,那么您是否需要拨打reloadData?除旋转动画外,它很可能会破坏这些动画。

  • 您可以提前创建节标题(也许在viewDidLoad中),然后在tableView:viewForHeaderInSection:中返回引用。当您致电reloadData时,这会保持动画不变。