2013-05-05 6 views
2

Я работаю над табличным просмотром, который содержит основные категории и подкатегории. Основными основными категориями являются заголовки разделов таблицы и когда пользователь нажимает кнопку в заголовке раздела tableview, я устанавливаю свой tableview для отображения этих подкатегорий (строк) в представлении таблицы.UIbutton on UITableview Раздел View не анимируется

Все работает отлично, но то, что я хочу сделать, - это когда пользователь нажимает кнопку «показать подкатегории» в заголовке раздела, мне нужна эта кнопка для анимации и поворота на 90 градусов. Кнопка - тип UIButtonTypeDetailDisclosure, поэтому я думаю, что у меня есть то, что я хочу.

Анимация работает, когда я добавляю код анимации в свой метод делегата «viewForHeaderInSection», но он не работает извне. странно действуют действия кликов. Heres код (Просто, чтобы сделать вещи ясно, что пользователь может просто нажать на главной категории, чтобы показать все, что в этой категории с жест распознаватель):

- (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; 
} 

И для моей кнопки Click действий:

- (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"]; 
} 

, как я сказал, когда я добавить содержимое rotatebutton методу viewForSection, кнопка вращается, но она не вращается при вызове из события лизать. Думаю, я нацелился на неправильный слой кнопки в этом методе.

Спасибо, что помогли!

ответ

1

Я бы предположил, что вызов reloadData заставляет табличное представление создать новый вид из tableView:viewForHeaderInSection:, который сразу же удаляет старый из иерархии представления и добавляет обратно невращающуюся.

Возможные решения:

  • Если вы уже делаете анимацию в insertRowsAtIndexPaths или deleteRowsAtIndexPaths, вам нужно вызов reloadData вообще? Это скорее всего разрушает эти анимации в дополнение к вашей анимации вращения.

  • Вы можете создать заголовки разделов заблаговременно (возможно, в viewDidLoad) и просто вернуть ссылку в tableView:viewForHeaderInSection:. Это приведет к сохранению любых анимаций, когда вы вызываете reloadData.

+0

не знала, что мне не нужно перезагружать данные, когда я использовал вставки или переделки. мне было интересно, почему мои анимации действуют странно LOL спасибо – dreampowder

1

360 * PI/180 = 2PI. Это 360 градусов. Используйте M_PI/2.

+0

спасибо за ответ, но степень вращения есть только для тестирования, основная проблема заключается в том, что анимация не применяется к кнопке при вызове метода «rotatebutton». – dreampowder

+1

Хм Это потому, что вы вызываете reloadData в клике? Это вызовет viewForHeader, где вы создадите новую кнопку! Анимация происходит в старом – Peteee24

Смежные вопросы