16

これは簡単な問題のように思えますが、解決策を見つけるためにレンガの壁にぶつかりました。ここにいる誰かが助けてくれることを願っています...

UITableViewStyleGroupedを使用してUITableViewを作成していますが、テーブルビューのすべてのセクションの最初の行と2番目の行の間に小さな(1ピクセル)白い線が表示されています(画像を参照)

ギャップの例

この線の理由は、各セクションの最初のセルが他のセクションより1ピクセル高いためと思われます。各グループの最初のセルの高さを29ピクセル(他のセルは30ピクセル)に設定すると、ギャップがなくなり、すべてが正常になります。

これは回避策は成功していますが、厄介なハックの使用を避けることができるように、これが発生する理由を知りたいと思います。

ご参考までに:

  • 使用して、これが背景画像の問題ではないことを確認しました。これらはすべて30ピクセルの高さであり、同じ結果になる上部の画像を中央の画像に置き換えました。
  • 私はseparatorStyle=UITableViewCellSeparatorStyleNoneを設定することにより、セル間のすべての境界線を削除しました
  • この効果はUITableViewStylePlainでは発生しません

どんな助けでも大歓迎です。

ありがとう

テーブル設定のコード:

  myTable = [[UITableView alloc] initWithFrame:CGRectMake(TABLE_SHIFT_OFFSET,
                                                          DATE_SLIDER_HEIGHT - DATE_SLIDER_SHADOW_HEIGHT,
                                                          326,
                                                          self.view.frame.size.height - DATE_SLIDER_HEIGHT + DATE_SLIDER_SHADOW_HEIGHT) style:UITableViewStyleGrouped];
  myTable.backgroundColor = [UIColor clearColor];
  myTable.backgroundView = nil;
  myTable.separatorStyle = UITableViewCellSeparatorStyleNone;
  [self.view addSubview:myTable];
  myTable.dataSource = self;
  myTable.delegate = self;

セル設定のコード:

- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
  // This is a hack to make sure that a white line doesnt appear between the
  // first and second rows in the table, which happens for reasons I dont understand
  if (indexPath.row == 0) {
    return 29;
  }

  return 30;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{     
  MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"satCell"];
  if (!cell)
  {
    cell = [[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"satCell"];
  }

  cell.backgroundView = nil;
  cell.backgroundView = [[UIView alloc] initWithFrame:CGRectZero];

  cell.backgroundColor = [UIColor whiteColor];
  int numberOfRowsInThisSection = [self tableView:tableView numberOfRowsInSection:indexPath.section];

  if (numberOfRowsInThisSection == 1)
  {
    cell.backingImage = self.singleWhite;
  }
  else if (indexPath.row == 0)
  {
    cell.backingImage = self.topWhite;
  }
  else if (indexPath.row % 2 == 0)
  {
    // Even row
    if (indexPath.row == numberOfRowsInThisSection - 1)
    {
      // Last row (even)
      cell.backingImage = self.botWhite;
    }
    else
    {
      // Normal row (even)
      cell.backingImage = self.midWhite;
    }
  }
  else if (indexPath.row % 2 == 1)
  {
    // Odd row
    if (indexPath.row == numberOfRowsInThisSection - 1)
    {
      // Last row (even)
      cell.backingImage = self.botDark;
    }
    else
    {
      // Normal row (odd)
      cell.backingImage = self.midDark;
    }
  }

  // Setup cell text [REMOVED FOR BREVITY]

  return cell;
}

MyTableViewCell内でバッキングイメージを設定するためのコード:

- (void)setBackingImage:(UIImage *)backingImage
{
  if (self.backingImage != backingImage)
  {
    _backingImage = nil;
    _backingImage = backingImage;
    self.backingView.image = backingImage;
  }
}

self.backingViewは、次のコードを使用して設定されます。

[[UIImageView alloc] initWithFrame:CGRectMake(7, 0, 307, 30)];
4

5 に答える 5

3

これは一種の既知の問題であり、グループ化されたtableViewの区切り文字を非表示にした場合にのみ発生します。これは、この他のスタックオーバーフローの質問でも発生しました。

簡単に言えば、上部と下部のセルは1つの余分なポイントを使用しますが、セパレーターはそれを非表示にするため、解決策は次のようになります。

  1. 追加の間隔を差し引きます(すでに行ったように)
  2. 背景を繰り返しパターンまたは伸縮可能な画像にします(自分自身を宣伝しようとはしていませんが、前のリンクされたスレッドで私が与えた答えは、伸縮可能な画像の作成方法も説明しています)。
  3. セパレータを非表示にしないでください。ただし、セルの背景との色が一致しているため、非表示のように見えます。

オプション2は「最もクリーン」であるように思われ、tableViewセルの可変高さをサポートするという利点が追加されます。

そして、なぜそれはその余分なポイントを持っているのですか?Appleだけが知っています。

于 2013-07-20T07:55:58.467 に答える
1

私の経験では、グループ化されたテーブルビューは、各セクションの最初と最後の行の高さに1ポイント(ピクセルではありません!)を追加します。テーブルセルクラスのlayoutSubviewsをオーバーライドするデバッグコードを追加し、superを呼び出してから、bounds.size.heightを出力することで、これを確認できるはずです。

これは境界線の描画用のスペースを提供するためだと思います。あなたと同じように、最初と最後のセルの高さに対して返す値を調整して、効果をキャンセルしました。外観が変更されたため、これはiOS7で変更される可能性があります。

[編集]これは、ビュー階層を検査するためのちょっとしたデバッグコードです。recursiveDescription(プライベートであり、デフォルトのXcode設定ではコードがコンパイルされないため、直接呼び出すことはできません。)

NSLog(@"%@", [self.view performSelector:@selector(recursiveDescription)]);

于 2013-06-19T21:07:44.900 に答える
1

次の手順を実行すると、問題が修正されます。「backingImage」(backingView)を削除します。代わりに、セルのbackgroundViewプロパティを使用して、それに割り当てるだけUIImageViewです。ここUIImageViewで、背景用にを作成するときは、次のようにUIImage伸縮可能にするようにしてください。

UIImage *bg = [UIImage imageName:@"filename.png"];
bg = [bg resizableImageWithCapInsets:UIEdgeInsetsMake(15, 0, 15, 0)];

注:画像の高さは30ポイントであると想定しています。使用している画像を見ると、この例で行っているように、垂直方向に引き伸ばすことができます。より多くのメモリを節約するために、水平方向に拡張することもできますが、所有しているアセットはそのために役立たない場合があります。

お役に立てれば!

于 2013-07-20T01:04:03.350 に答える
1

グループ化されたテーブルビューにセパレータがないiOS8でも、問題が発生しました。私のセクションの間には0.5fポイントのギャップがありました。テーブルビューの後ろの背景が同じ色ではなかったので、それは非常に目立ちました。解決策は、高さ1ピクセルの空白のヘッダービューで埋めてから、別のビューで1ピクセルずつ流出させることです。チャームのように機能します。

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 1)];
    view.backgroundColor = [UIColor whiteColor];
    view.opaque = YES;
    view.clipsToBounds = NO;

    //Spill a view out by one pixel.
    UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 2)];
    subView.backgroundColor = [UIColor whiteColor];
    subView.opaque = YES;
    [view addSubview:subView];
    return view;
}

- (CGFloat)tableView:(UITableView *)tableView
heightForHeaderInSection:(NSInteger)section {
    return 1;
}
于 2015-06-16T19:11:36.743 に答える
0

これは私にとって悲鳴を上げるセクションヘッダーです。viewForHeaderInSectionメソッドをオーバーライドしていますか?私の推測では、各セクションの最初のセルの境界は、そのセクションのヘッダーの境界とはどういうわけか省略されています。

これらのメソッドをオーバーライドしてみてください。

– tableView:viewForHeaderInSection:
– tableView:viewForFooterInSection:
– tableView:heightForHeaderInSection:
– tableView:heightForFooterInSection:
– tableView:willDisplayHeaderView:forSection:
– tableView:willDisplayFooterView:forSection:

そして彼らが返すもので遊んでください。特にheightForHeaderInSection/viewForHeaderInSection / willDisplayHeaderView:ForSection:

于 2013-02-13T02:38:23.247 に答える