15

UITableViewカスタムUITableViewCellsでを作成しています。iOS 7 の新しい削除ボタンが、セルのレイアウトに問題を引き起こしています。

赤い円が表示される「編集」ボタンを使用すると問題が発生しますが、単一のセルをスワイプすると完璧に見えます。

これは、[編集] ボタンを使用した場合です。

[self.tableView setEditing:!self.tableView.editing animated:YES];

内容が削除ボタンに重なっている

これは、単一のセルをスワイプしたときです。

コンテンツが正しく配置されている

ご覧のとおり、私のラベルは最初の例の削除ボタンと重なっています。なぜこれを行うのですか?どうすれば修正できますか?

4

11 に答える 11

7

ビューを自分で追加するのではなく、のaccessoryViewおよびeditingAccessoryViewプロパティを使用してみてください。UITableViewCell

編集モードと非編集モードの両方で同じインジケーターを表示する場合は、両方のビュー プロパティを同じビューを指すように設定してみてくださいuiTableViewCell

self.accessoryView = self.imgPushEnabled;
self.editingAccessoryView = self.imgPushEnabled;

IOS7 のテーブル編集アニメーションに不具合があり、accessoryView非編集状態に戻るときに削除ボタンと が重なって表示されるようです。これは、accesoryViewが指定され、 が である場合に発生するようeditingAccessoryViewですnil

このグリッチの回避策は、次のような非表示の editAccessoryView を指定しているようです。

self.editingAccessoryView =[[UIView alloc] init];
self.editingAccessoryView.backgroundColor = [UIColor clearColor];
于 2013-09-26T09:26:47.650 に答える
4

問題は、編集モードでセルの contentView のサイズが変わることです。したがって、セルでオーバーライドlayoutSubviewsして、さまざまなフレームサイズをサポートする必要があります

- (void) layoutSubviews
{
    [super layoutSubviews];
    CGRect contentFrame = self.contentView.frame;
    // adjust to the contentView frame
    ...
}

または、餌を取り、自動レイアウトに切り替えます。

contentView.clipsToBounds最初に、に設定するのは醜い回避策になると思いましYESたが、うまくいかないようです。

于 2013-10-22T16:33:02.023 に答える
2

カスタム TableViewCell クラスでこのメソッドを使用するだけで、完璧な答えを得ることができます。

ここselfUITableviewCell

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

        }
     }
  }
}
于 2014-03-05T06:57:03.397 に答える
2

tcurdt が述べたように、この問題を解決するために autolayout に切り替えることができます。ただし、(当然のことながら) この 1 つのインスタンスのためだけに autolayout を台無しにしたくない場合は、autoresizingMask を設定して、それを適切な autolayout 制約に自動的に変換することができます。

label.autoresizingMask = UIViewAutoresizingFlexibleWidth;
于 2014-02-06T17:25:56.903 に答える
1

UITableViewCell の contentView にコンテンツを配置する場合は、layoutSubviews ではself.contentView.frame.size.widthなくself.frame.size.width、必ず使用してください。

self.frame編集モードで幅を拡張し、右側のコンテンツが contentView の境界を超えて拡張されます。self.contentView.frame正しい幅のままです(そして、これを使用する必要があります)。

于 2016-08-20T16:29:14.743 に答える
1

カスタム セルの前面UITableViewCellDeleteConfirmationViewに移動するlayoutSubviewsと、iPhone では機能しますが、iPad では機能しません。

iPad 用のUITableViewのマスター部分に があります。この場合、 のフレームは (320 0; 89 44) ではなく (768 0; 89 44) です。splitViewControllerUITableViewCellDeleteConfirmationView

layoutSubviewsしたがって、メソッドでフレームのサイズを変更すると、これが機能します

- (void)layoutSubviews {
    [super layoutSubviews];
    for (UIView *subview in self.subviews) 
    {
        for (UIView *subview2 in subview.subviews) 
        {
            if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) 
            { 
                CGRect frame = subview2.frame;
                frame.origin.x = 320;
                subview2.frame = frame;
                [subview bringSubviewToFront:subview2];
           }
        }
    }
}
于 2014-03-06T13:52:41.307 に答える
1

この問題を解決する最善の方法は、セルに画像を追加し、裏面に設定することです。

      UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bgImg.png"]];
      imageView.frame = CGRectMake(0, 0, 320, yourCustomCell.frame.size.height);
      [yourCustomCell addSubview:imageView];
      [yourCustomCell sendSubviewToBack:imageView];

テキストが削除ボタンと重なる場合は、Autolayout を実装してください。それはより良い方法でそれを管理します。

cellSelectionStyle がデフォルトの色で強調表示されるもう 1 つのケースを生成できます。次のようにハイライト色を設定できます

      yourCustomCell.selectionStyle = UITableViewCellSelectionStyleNone;

テーブル セルの選択スタイルを UITableViewCellSelectionStyleNone に設定します。これにより、青い背景の強調表示などが削除されます。次に、テキスト ラベルまたはコンテンツ ビューの強調表示を希望どおりに機能させるには、このメソッドを yourCustomCell.m クラスで使用します。

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    if (highlighted)
        self.contentView.backgroundColor = [UIColor greenColor];
     else
        self.contentView.backgroundColor = [UIColor clearColor];
}

より良い方法で理解していただければ幸いです。

于 2013-10-03T13:42:12.137 に答える
0

私の解決策は、削除ボタンが表示されているときに contentView 全体を左に移動することです。

override func layoutSubviews() {
    super.layoutSubviews()

    if editingStyle == UITableViewCellEditingStyle.Delete {
        var rect = contentView.frame
        rect.origin.x = self.showingDeleteConfirmation ? -15 : 38
        contentView.frame = rect
    }
}
于 2015-08-18T03:53:28.193 に答える