2

アプリでカスタムを使用していてUITableViewCell、「スワイプして削除」ボタンのフレームを調整しようとしています。

これは私がしていることです:

- (void)layoutSubviews {
    [super layoutSubviews];
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) return;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:0.0f];
    for (UIView *subview in self.subviews) {
        if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) {
            CGRect newFrame = subview.frame;
            newFrame.origin.x = newFrame.origin.x - 25;
            subview.frame = newFrame;
        } else if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellEditControl"]) {
            CGRect newFrame = subview.frame;
            newFrame.origin.x = newFrame.origin.x - 25;
            subview.frame = newFrame;
        }
    }
}

それは新しい位置に現れます、それは素晴らしいです。しかし、ボタンから離れてクリックして消えると、ボタンが突然左に約10ポイント移動したように見え、その後削除されます。

なぜこれが起こっているのですか、どうすれば修正できますか?

4

1 に答える 1

4

使用しているアニメーションコードに慣れていませんが、tableViewCellsの編集中にアニメーションを処理する代わりにwillTransitionToState、(および必要に応じて)を使用してみます。didTransitionToStatelayoutSubviews

どちらもiOS3.0以降で利用できます。

このコードをのサブクラスに配置しますUITableViewCell。ある状態から別の状態へのすべての遷移を処理しUITableViewCellStateMask、各状態への遷移に必要なアニメーションを実装できます。追加したNSLogに従って、必要なアニメーションを適切な場所に実装するだけです。(繰り返しますが、アニメーションコードに精通していませんが、テストを行い、このコードを使用して結果を確認しました)

- (void)willTransitionToState:(UITableViewCellStateMask)state {

    [super willTransitionToState:state];

    if (state == UITableViewCellStateDefaultMask) {

        NSLog(@"Default");
        // When the cell returns to normal (not editing)
        // Do something...

    } else if ((state & UITableViewCellStateShowingEditControlMask) && (state & UITableViewCellStateShowingDeleteConfirmationMask)) {

        NSLog(@"Edit Control + Delete Button");
        // When the cell goes from Showing-the-Edit-Control (-) to Showing-the-Edit-Control (-) AND the Delete Button [Delete]
        // !!! It's important to have this BEFORE just showing the Edit Control because the edit control applies to both cases.!!!
        // Do something...

    } else if (state & UITableViewCellStateShowingEditControlMask) {

        NSLog(@"Edit Control Only");
        // When the cell goes into edit mode and Shows-the-Edit-Control (-)
        // Do something...

    } else if (state == UITableViewCellStateShowingDeleteConfirmationMask) {

        NSLog(@"Swipe to Delete [Delete] button only");
        // When the user swipes a row to delete without using the edit button.
        // Do something...
    }
}

そして、これらのイベントのいずれかの後に何かが発生する必要がある場合は、同じコードを実装するだけですが、didTransitionToState。同じUITableViewCellStateMaskことが当てはまります。

于 2013-01-15T01:59:12.337 に答える