9

UIEdgeInsetsMakeセルの背景をグラデーションに設定するために使用しようとしています。動作させるために複数のことを試しましたが、何を使用しても常に問題があります。

私は単に2つの静的セルを持っており、そこでそれらを設定しようとしてbackgroundViewwillDisplayCell:ます. 上部、下部、および中央のセルに個別の画像がありますが、2 つのセルがあるため、上部と下部のみが必要です。これらはそれらの画像です:

ここに画像の説明を入力

ここに画像の説明を入力

それらの間に2ポイントの線がないように、下の線の上に行がありません。一番下の高さを少し調整して補正しました(1pt高く)。これらの画像は 44x44pt です。

私はそれらを次のように設定しました:

- (void)tableView:(UITableView *)tableView 
  willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 0) {
        UIImageView *topCellBackgroundImageView = 
        [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"grouped-cell-bg-top"]
               resizableImageWithCapInsets:UIEdgeInsetsMake(5.0, 5.0, 5.0, 5.0)]];
        cell.backgroundView = topCellBackgroundImageView;
    }
    // If it's the last row
    else if (indexPath.row == ([tableView numberOfRowsInSection:0] - 1)) {
        UIImageView *bottomCellBackgroundImageView = 
        [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"grouped-cell-bg-bottom"] 
               resizableImageWithCapInsets:UIEdgeInsetsMake(5.0, 5.0, 5.0, 5.0)]];
        cell.backgroundView = bottomCellBackgroundImageView;
    }

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}

これはうまくいきません。下の画像でわかるように、一番上のセルには、セル全体に 1pt の白い「バンド」があり、かなり見栄えが悪いです。なぜそこにあるのかわかりません。

ここに画像の説明を入力

topCellBackgroundViewそのため、 を のエッジ インセットを持つように変更しました。これ(5.0, 5.0, 0.0, 5.0)は、上部のみが丸められているため、bottomプロパティを考慮する必要がないためです (フラットです)。それは完璧に機能します!セルを選択する場合を除き、一番下のセルがそのセル全体を占めることはなくなりました。

ここに画像の説明を入力

私はどうしたらいいですか?何をしてもうまくいかないようです。また、0.0 の代わりに 1.0 を試してみました。また、-1.0 も役に立ちませんでした。

4

3 に答える 3

9

朗報です。あなたは気が狂うことはありません。伸縮可能な画像コードはおそらく完璧です。問題は、グループ化されたスタイルの UITableView が、返される値に加えて、セルの高さに余分なポイントを追加することですheightForRowAtIndexPath:

したがって、問題の解決策はheightForRowAtIndexPath:、セクション内の行の総数に基づいて調整されたセルの高さを返すことです。

- (CGFloat)heightForRow:(NSIndexPath *)indexPath {
    CGFloat standardHeight = 44.0f;
    NSInteger numberOfRowsInSection = [self numberOfRowsInSection:indexPath.section];

    if (numberOfRowsInSection == 1) {
        standardHeight -= 2;
    }
    else if (indexPath.row == 0 || indexPath.row == numberOfRowsInSection-1) {
        standardHeight -= 1;
    }

    return standardHeight;
}

UITableView がこれを行う方法を示すサンプル画像を次に示します。

uitable-view-grouped-style-borked

私の知る限り、グループ化されたスタイル テーブル ビューのみが影響を受けます。その場合でも、特定のセクションの行の総数に基づいて効果が変わります。

  1. 1 行セルの高さに 2 つのポイントを追加します (デフォルトの高さは Retina で 92 ピクセルです)。
  2. 2 行最初と最後の行の高さに 1 ポイントを追加します (Retina ではデフォルトでそれぞれ 90 ピクセルの高さ)。
  3. 3 行最初と最後の行の高さに 1 ポイントを追加します (Retina ではデフォルトでそれぞれ 90 ピクセルの高さ)。中央の行は影響を受けません。

これは非常に苛立たしく、私の知る限り文書化されたことはありません。:-)

アップデート

上記の計算は、デフォルトのセパレータ スタイル を使用した、グループ化されたスタイルのテーブル ビューに対するものですUITableViewCellSeparatorStyleSingleLineEtched。他の場合 (すなわちUITableViewCellSeparatorStyleSingleLineおよびUITableViewCellSeparatorStyleNone) で行うことは次のとおりです。

- (CGFloat)tableView:(UITableView *)tableView 
   heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGFloat rowHeight = 44.0f;
    if (indexPath.row == 0) {
        rowHeight -=1;
    }
    return rowHeight;
}
于 2013-07-14T19:00:59.373 に答える