Поверните UIButton на разделе таблицы

У меня есть UIButton на заголовке раздела с именем extendButton. Я хочу повернуть его на 180 градусов при нажатии.

- (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if (section == 3) {
        OrderHistoryHeaderView *orderHeaderView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"OrderHistoryHeaderView"];
        if (orderHeaderView == nil) {
            orderHeaderView = [[[NSBundle mainBundle] loadNibNamed:@"OrderHistoryHeaderView" owner:self options:nil] objectAtIndex:0];
            orderHeaderView.contentView.backgroundColor = [UIColor whiteColor];
            [orderHeaderView.extendButton addTarget:self action:@selector(extendButtonPressed) forControlEvents:UIControlEventTouchUpInside];
        }
        return orderHeaderView;
    }

    ProductDetailHeaderView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"ProductDetailHeaderView"];
    if (headerView == nil) {
        headerView = [[[NSBundle mainBundle] loadNibNamed:@"ProductDetailHeaderView" owner:self options:nil] objectAtIndex:0];
        headerView.contentView.backgroundColor = [UIColor whiteColor];
    }

    headerView.mainLabel.text = headerTitleArray[section];
    return headerView;
}


    - (void)extendButtonPressed {
     if (isExtend) {

    //call rotate method
    [self rotateButton:sender];

    //insert row
    unsigned long rowCount = orderHistoryArray.count;

    //show msg if no history data
    if (rowCount == 0) {
        [ShareFunction showSimpleAlertWithString:@"No order history data!!" inVC:self];
    }

    orderHistoryArray = nil;
    NSMutableArray *indexPathSet = [[NSMutableArray alloc] init];
    for (int i = 0 ; i < rowCount; i++) {
        [indexPathSet addObject:[NSIndexPath indexPathForRow:i inSection:3]];
    }
    [_mainTableView beginUpdates];
    [_mainTableView deleteRowsAtIndexPaths:indexPathSet withRowAnimation:UITableViewRowAnimationAutomatic];
    [_mainTableView endUpdates];

} else {
    //delete row

    //call rotate method
    [self rotateButton:sender];

    orderHistoryArray = productHistoryArray;

    //show msg if no history data
    //if (orderHistoryArray.count == 0) {
    //    [ShareFunction showSimpleAlertWithString:@"No order history data!!" inVC:self];
    //}


    NSMutableArray *indexPathSet = [[NSMutableArray alloc] init];
    for (int i = 0 ; i < orderHistoryArray.count; i++) {
        [indexPathSet addObject:[NSIndexPath indexPathForRow:i inSection:3]];
    }
    [_mainTableView beginUpdates];
    [_mainTableView insertRowsAtIndexPaths:indexPathSet withRowAnimation:UITableViewRowAnimationAutomatic];
    [_mainTableView endUpdates];
}

    }

И мой метод rotateButton

- (void)rotateButton:(UIButton*)button {
    button.transform = CGAffineTransformMakeRotation(M_PI);
}

Когда я нажимаю на кнопку, она теперь может поворачиваться на 180 градусов, а tableView для этого раздела расширен, но когда я нажимаю снова, кнопка остается той же нет поворота. Чего мне здесь не хватает?

2 ответа

  1. Здесь я нашел решение путем передачи параметра isExtend

    - (void)rotateButton:(UIButton*)button isExtend:(BOOL)isExtended{
    
        if (isExtended) {
            button.transform = CGAffineTransformMakeRotation(0);
        } else {
            button.transform = CGAffineTransformMakeRotation(M_PI);
        }
    
    }
    
  2. Код в вашем ответе работает, но есть лучший способ.

    Используйте функцию CGAffineTransformRotate, которая добавляет вращение к существующему преобразованию:

    button.transform = CGAffineTransformRotate(button.transform, M_PI)
    

    Далее анимация вращения, а не кнопка перехода к новому вращению. Для этого можно использовать UIViewметод animateWithDuration.

    Метод кнопки для поворота кнопки на 180 градусов будет выглядеть примерно так:

    - (IBAction)buttonAction:(UIButton *)sender {
      CGAffineTransform transform = sender.transform;
      transform = CGAffineTransformRotate(sender.transform, M_PI);
      [UIView animateWithDuration: 0.5 animations: ^{
        sender.transform = transform;
      }
       ];
    }