web-dev-qa-db-ja.com

iOS 7.1 UitableviewCellコンテンツは以下のものと重複しています

だから、iOS 7.0では正常に動作するが7.1では動作しないコードがあります。コード付きのシンプルなテーブルビューがあります:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 10;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 70.0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    for (UIView *view in cell.contentView.subviews) {
        [view removeFromSuperview];
    }

    UILabel *label = [[UILabel alloc] init];
    label.text = [NSString string];

    for (NSInteger i = 0; i < 20; i++) {
        label.text = [label.text stringByAppendingString:@"label String "];
    }

    label.translatesAutoresizingMaskIntoConstraints = NO;
    label.numberOfLines = 0;
    label.lineBreakMode = NSLineBreakByWorldWrapping;
    //label.lineBreakMode = NSLineBreakByTruncatingTail; //I have tried this too
    [cell.contentView addSubview:label];

    NSDictionary *dict = NSDictionaryOfVariableBindings(label);
    [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-8-[label]-8-|" options:0 metrics:nil views:dict]];
    [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[label]" options:0 metrics:nil views:dict]];

    if (indexPath.row == 0) {
        label.textColor = [UIColor colorWithRed:1.0 green:0 blue:0 alpha:1.0];
    }
    else if (indexPath.row == 1) {
        label.textColor = [UIColor colorWithRed:0 green:1.0 blue:0 alpha:1.0];
    }
    else if (indexPath.row == 2) {
        label.textColor = [UIColor colorWithRed:0 green:0 blue:1.0 alpha:1.0];
    }
    else {
        label.textColor = [UIColor colorWithWhite:0.3 alpha:1.0];
    }

    cell.backgroundColor = [UIColor colorWithWhite:1.0 alpha:1.0];
    return cell;
}

私は10列の1セクションを持っています。各行を再利用して、contentViewからすべてのサブビューを削除します(alloc-init UITableViewCellを試しましたが、同じ結果になりました)。

IOS 7.0では、UILabelは所属するセルにのみ表示されます。ただし、7.1では、UILabelは別のセルの上に表示され続けます。興味深いのは、セルをクリックすると、他のセルとの重なりが止まることですが、上のセルをクリックするまでです。私の質問は、7.0onesのような7.1デバイスでそれを動作させる方法です。

シミュレーターとデバイスの両方を試し、iOS 7.1 API Diffsを調べましたが、これに関連するものは見つかりませんでした。

たぶんそれは自動レイアウトの問題で、UILabelの可変の高さがありますが、そうする必要があります。すべてのテキストをUILabelに入れたいが、セルに表示できるUILabelの一部のみを表示します。これは7.0のデフォルトの動作ですが、7.1ではこれが変更されます。

これは、詳細説明付きの画像用のドロップボックスフォルダーです: Folder with images

更新:テセのようなことを試しましたが、何もうまくいきませんでした。

cell.frame = CGRectMake(0, 0, self.tableView.frame.size.width, 70);
cell.contentView.frame = CGRectMake(0, 0, self.tableView.frame.size.width, 70);

cell.opaque = NO;
cell.contentView.opaque = NO;

cell.clearsContextBeforeDrawing = NO;
cell.contentView.clearsContextBeforeDrawing = NO;

cell.clipsToBounds = NO;
cell.contentView.clipsToBounds = NO;
30
Matej Kosiarcik

問題は、セルの高さに関係しています。それはあなたのためにそれを動的に調整するつもりはありません。

スクロールして上記のビューが表示されなくなると、重複するテキストが消えることに気付くでしょう。

テキストを特定の高さで切り取りたい場合は、行数を0に設定するのではなく、行数を設定する必要があります。これにより、テキストは永久に継続されます。

lineBreakModeは停止されないため有効になりません。

必要に応じて、contentViewでクリッピングを設定して、すべてのサブビューが内部にとどまるようにすることができます。

目的の最終結果に応じて、コンテンツに基づいて動的な高さを変更できます。これを行うことに関連する多くのSOの質問があります。

更新-contentViewのクリッピング

私は自分で試してみる必要がありますが、その代わりに、contentViewのクリッピングに関連するリンクがいくつかあります:

このように見えます:

cell.clipsToBounds = YES;
62
RyanJM

これが、セル内の重複コンテンツの完璧なソリューションです。

セルを割り当てた後、サブビューを追加する前に、cellForRowAtIndexPathで次のコードを使用するだけです。

for (id object in cell.contentView.subviews)
{
    [object removeFromSuperview];
}  

実際には、TableViewをスクロールするたびに、追加したビューが何度も割り当てられるため、重複が発生しています。したがって、上記のコードは、セルのcontentViewから既存のビューを削除することで問題を解決します。

これで、上記のコードを適用した後、メモリデバッグセッションを確認できます。今回はメモリが安定しています。

それがあなたを助けることを願っています。

ありがとう!

6
Gaurav Singla

@ Gauravあなたの答えは受け入れられた答えであるべきです。ありがとう!

for object in cell.contentView.subviews
            {
                object.removeFromSuperview();
            }
1

ストーリーボード/ IBを使用して、iOS 8でも同様の動作をしました。

修正は、プロトタイプセルのコンテンツビューの一番下のビューからBottom Space to: Superview制約を追加することでした。他のビューと制約はすべて上から固定されています。

1
GraehamF

これは、セルの内容の再作成に関する問題です。次のコードセグメントで試してください。

for(UIView *view in cell.contentView.subviews){  
        if ([view isKindOfClass:[UIView class]]) {  
            [view removeFromSuperview];   
        }
    }
1
Samitha K

ストーリーボードを使用していますか?その場合、ストーリーボードでTable View Controllerを選択し、「下部バーの下」のチェックを外します。これはプログラムで行うこともできます。

TVCがnav View ControllerまたはTab View Controllerを継承している場合、代わりに親ビューでこのレイアウトオプションをオフにする必要がある場合があります

0
TooManyEduardos