12

アップデート:

「Evgeny S」からの情報のおかげで、削除ボタンを覆っているのはセルの背景であると判断できました。cell init の最初に次の関数を呼び出しました。

- (void) setupGradientsWithHeight:(int) the_height
{
    CAGradientLayer* gradient = [CAGradientLayer layer];

    gradient.frame  = CGRectMake(self.bounds.origin.x,
                                 self.bounds.origin.y,
                                 self.bounds.size.width,
                                 the_height);

    gradient.colors = [NSArray arrayWithObjects:
                       (id)[UIColor colorWithRed:218.0f/255.0f
                                           green:218.0f/255.0f
                                            blue:220.0f/255.0f
                                           alpha:1.0].CGColor,
                       (id)[UIColor colorWithRed:180.0f/255.0f
                                           green:180.0f/255.0f
                                            blue:184.0f/255.0f
                                           alpha:1.0].CGColor,nil];

    UIView* bgview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];

    [bgview.layer addSublayer:gradient];
    [self setBackgroundView:bgview];
}

この問題は、backgroundview を追加しないことで解決されます。ただし、各セルのグラデーションの背景を維持しながら、どのように解決できるのでしょうか?

2 つのうちの 1 つが起こっている可能性があります。削除ボタンが表示されると、背景ビューがシフトされてから戻るか、サイズが縮小されてから戻るかのいずれかです。グラデーションフレームの幅コンポーネント「self.bounds.size.width」をいじってみましたが、この関数はセルの初期化時に1回しか呼び出されないため、それがどのように影響するかはまだわかりません。

元の投稿:

iOS6 SDK の下で Xcode4 でアプリを作成しましたが、新しい環境 (Xcode5 および iOS7 SDK) にロードした後、問題が発生しました。移行時に表示されたすべてのビルド エラーと警告を解決したことに注意してください。

いくつかのセルを含むテーブルビューがあります。編集モードに入った後、赤いトグル ボタンをクリックしてセルの削除モードを開始すると、アニメーションが開始され、[削除] ボタンが表示されますが、短時間だけで、突然再び非表示になります。

私が注意すべきもう1つの奇妙な点は、削除ボタンが隠されている間でも、あるべき場所をクリックしてセルを削除できることです。

「カスタムコード」をできるだけ多く取り出そうとしました。オーバーライドした関数を削除し、可能な限り元の状態に戻そうとしましたが、役に立ちませんでした。

ある時点で、出力ログに奇妙なメッセージが表示されていました。なんらかの理由でメッセージが表示されなくなり、そのとき何をしていたか思い出せないようです。

これを引き起こしている可能性のあるものについての考えや推奨事項はありますか?

http://www.youtube.com/watch?v=vCAGzSaOwp4

4

12 に答える 12

13

削除ボタン ビューを見つけて前面に移動することで、これを修正しました。UITableViewCell サブクラスの layoutSubviews でこれを行いました。

これを行う方法のアイデアを提供する小さなコードを次に示します。

- (void)layoutSubviews
{
    [super layoutSubviews];

    for (UIView *subview in self.subviews) {

        for (UIView *subview2 in subview.subviews) {

            if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { // move delete confirmation view

            [subview bringSubviewToFront:subview2];

        }
    }
}
于 2013-10-07T10:53:16.310 に答える
10

これは、iOS 7 の無数のバグの 1 つです。

何らかの理由で、iOS によって backgroundView が削除ボタンの上に移動されます。これを回避するには、backgroundView をサブクラス化し、派生ビューの setFrame 関数を次のように実装します。

- (void)setFrame:(CGRect)frame
{
    if ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) {
        // background view covers delete button on iOS 7 !?!
        [super setFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height)];
    } else {
        [super setFrame:frame];
    }
}

補足として、派生ビューでlayerClassをサブクラス化して実装することにより、別のサブレイヤーの必要性を回避できます。

+ (Class)layerClass
{
    return [CAGradientLayer class];
}
于 2013-09-27T15:45:59.730 に答える
5
- (void)layoutSubviews
{
    [super layoutSubviews];
    [self sendSubviewToBack:self.contentView];
}
于 2013-10-10T08:43:59.800 に答える
2

colorWithPatternImage を使用できますが、私にとっては self.layer.content を使用する方が簡単でした。例えば ​​:

cell.layer.contents = (id)[UIImage imageNamed:@"singleRow.png"].CGImage;

そうすれば、画像が引き伸ばされず、正確なサイズである必要はありません。こうすることで、削除ボタンがセルの背景画像に覆われることはありません。ところで: これらのカスタム グラデーション背景は、iOS 7 の基本的な外観と一致していないようですが、それがアプリを承認しない理由になると思いますか?

于 2013-09-28T13:53:11.490 に答える
2

UITableView が編集モードになっていて、2 ~ 3 行を削除した後、「すでにセルがあるときにスワイプを設定してセルを削除しようとしています....それは良くないようです」というメッセージがログに記録され、その後、問題に直面していました。 1 つのセルを除くすべてのセルでのユーザー操作が無効になります。

私はこの問題を解決しました

[myTableView setEditing:NO animated:NO];
[myTableView setEditing:YES animated:NO];

各削除後。

私の場合、この回避策はうまくいきました。

于 2013-10-23T06:23:57.223 に答える
1

クリーナー、一般的なソリューション

上記の chris が投稿したものと同様の手法を使用する iOS7 専用アプリを想定すると、 https ://stackoverflow.com/a/19416870/535054 のアプローチがよりクリーンになると思います。

このアプローチでは、backgroundView をサブクラス化する必要はありません。これは、セルごとに異なる可能性があります。

上記にリンクした回答のコードをカスタム テーブル セル階層のルートに配置し、すべてのテーブル セル (それから継承) を配置して、backgroundViewまたはselectedBackgroundViewプロパティを使用するたびに修正を取得します。

于 2013-10-17T01:52:04.040 に答える
1

私は同様の問題に遭遇し、セル コンテンツの上に [削除] ボタンを配置する回避策を持っていますが、アニメーションは少し醜いです。完了すると、ボタンが表示され、正しいことを行います。

UITableViewCell のカスタム サブクラスを作成し、次のコードを追加します。

-(void)didTransitionToState:(UITableViewCellStateMask)state
{
    if (state & UITableViewCellStateShowingDeleteConfirmationMask ) {
        [self sendSubviewToBack:self.contentView];

    }

    [super didTransitionToState:state];
}

このアプローチまたは他のポインタの改善をいただければ幸いです。

于 2013-09-27T19:35:49.300 に答える
1

XCode 5.0.1 に更新した後もこの問題が発生しますが、別の回避策を使用しました。これは、ブール値の名前付きchangeTitleセットを NO に設定し、行削除モードでない場合はwillBeginEditingRowAtIndexPathYES に設定するというものです。editingStyleForRowAtIndexPath

次に、その変数を使用して、ボタンのタイトルに余分なスペースを追加しますtitleForDeleteConfirmationButtonForRowAtIndexPath

-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0 && changeTitle) {
        return @"        Delete";
    }
    return @"Delete";
}

それは私にとってはうまくいきますが、主な欠点は、確認領域が思ったよりも広いため、意図しない削除が可能であることです.

于 2013-10-26T16:30:37.300 に答える
0

パフォーマンスを向上させるために UITableviewController をサブクラス化し、このコードを追加することを確認してください。

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {

[super setEditing:editing animated:animated];

CGRect frame = self.tableView.frame;

if(editing){
    [self.tableView setFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height)];
    //other codes to run if needed
}else{
    [self.tableView setFrame:frame];
    //other codes to run if needed
}

}

于 2013-12-04T09:47:29.287 に答える
0

プロジェクトを iOS 6 SDK で開始し、ストーリーボードを使用している場合、これは制約の問題である可能性があります。すべてのセル制約を削除してみて、提案された状態に戻ってください。これにより、削除ボタンの問題が解決される場合があります。私は2つの異なるプロジェクトでこのような問題を抱えていましたが、説明した方法で解決されました.

于 2013-10-27T14:40:26.013 に答える
0

そしてもう1つの回避策:

- (void) layoutSubviews {
    [super layoutSubviews];

    if ([ [ [UIDevice currentDevice] systemVersion] compare: @"7.0" options: NSNumericSearch] != NSOrderedAscending) {
        if (iOS7 == YES) {
            self.backgroundView.frame = CGRectMake(0, self.backgroundView.frame.origin.y,
                                                   self.backgroundView.frame.size.width, self.backgroundView.frame.size.height);
    }
}
于 2013-11-25T08:11:21.500 に答える