2

メインカテゴリとサブカテゴリを含むテーブルビューに取り組んでいます。基本的にメイン カテゴリはテーブルビュー セクション ヘッダーであり、ユーザーがテーブルビュー セクション ヘッダーのボタンをクリックすると、これらのサブカテゴリ (行) をテーブルビューに表示するようにテーブルビューを設定します。

すべてがうまく機能しますが、私がやりたいことは、ユーザーがセクション ヘッダーの [サブカテゴリを表示] ボタンをクリックしたときに、そのボタンをアニメーション化して 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"];
}

私が言ったように、rotatebutton の内容を viewForSection メソッドに追加すると、ボタンは回転しますが、lick イベントから呼び出されたときに回転しません。この方法で間違ったボタンレイヤーをターゲットにしていると思います..

助けてくれてありがとう!

4

2 に答える 2

1

reloadDataへの呼び出しは、テーブル ビューに から新しいビューを作成することを強制していると思いますtableView:viewForHeaderInSection:。これにより、ビュー階層から古いビューがすぐに削除され、回転されていないビューが追加されます。

可能な解決策:

  • insertRowsAtIndexPathsまたはで既にアニメーションを行っている場合deleteRowsAtIndexPaths、 を呼び出す必要はありますreloadDataか? 回転アニメーションに加えて、これらのアニメーションを台無しにする可能性が最も高い.

  • viewDidLoad事前に (おそらく) セクション ヘッダーを作成し、参照を に返すことができますtableView:viewForHeaderInSection:。これにより、 を呼び出したときにアニメーションがそのまま維持されますreloadData

于 2013-05-05T14:29:10.373 に答える
1

360*PI/180 = 2PI。それは360度です。M_PI/2 を使用します。

于 2013-05-05T11:16:13.590 に答える