web-dev-qa-db-ja.com

TableViewの区切り線の前の空白

UITableViewについて質問があります... UITableViewControllerがあり、カスタムセルを作成しました。 tableViewを視覚化すると、このスクリーンショットを見るとわかるように、区切り線の前に小さな空白があります。

enter image description here

どうして?デフォルトの視覚化ですか?この白い左パディングを削除するために何かを変更できますか?

45
Safari

IOS 7では、カスタムセルであっても、デフォルトで先頭の空白が提供されます。

UITableviewCellのこのプロパティseparatorInsetをチェックアウトして、セルの行セパレーターの両端の空白を削除/追加します。

//空白を削除します

cell.separatorInset = UIEdgeInsetsZero;

または、UITableViewレベルで、このプロパティを使用できます-

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {  // Safety check for below iOS 7 
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}

更新-以下のコードはiOS 7およびiOS 8で動作します:

-(void)viewDidLayoutSubviews
{
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [self.tableView setLayoutMargins:UIEdgeInsetsZero];
    }
}

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}
89
Ashok

または、これをインターフェイスビルダー(IB)で編集することもできます。

  1. IBに移動します。
  2. テーブルビューを選択します。
  3. 右側の「属性インスペクター」を開きます。
  4. 「セパレーターインセット」をデフォルトからカスタムに変更します。
  5. 「左」属性を15から0に変更します。

これは@Ashokの答えと同じ効果がありますが、コードを書く必要はありません。

更新 iOS 7および8で動作

更新 iOS 9で動作

33
michaelavila

以下のコードを使用して、UITableViewの不要なパディングを削除します。両方で動作しますIOS 8&7

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell     forRowAtIndexPath:(NSIndexPath *)indexPath
{

    if ([tableView respondsToSelector:@selector(setSeparatorInset:)])
    {
        [tableView setSeparatorInset:UIEdgeInsetsZero];
    } 

    if ([tableView respondsToSelector:@selector(setLayoutMargins:)])
    {
        [tableView setLayoutMargins:UIEdgeInsetsZero];
    }

    if ([cell respondsToSelector:@selector(setLayoutMargins:)])
    {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}
16
Anooj VM

空白はありません!これにバグを入力し、Appleは「バグではない」として閉じましたが、なぜバグではないのかを教えてくれました。 simple project Appleが言ったように、これらのピクセルの色は実際にはセル自体の背景色(contentsViewではありません!)であるということです私。

Cell.contentView.backgroundColorは緑で、cell.background色は赤です(Pixieで撮影):

enter image description here

最終的に、セパレータなしで、cell.contentViewはセルを完全に埋めます。セパレータを使用すると、下部にピクセルまたは2つのギャップがあります。セパレータは、挿入されると、ほとんどのギャップを埋めますが、セルの一部のピクセルが透けて見えます。

謎が解けた!

編集:ストーリーボードの設定方法によっては、contentView.backgroundColorが「失われる」か、白に設定されるようです。セルを供給するときにそれを乗り越えれば、あなたが望む行動を得ることができます:

    let cell = tableView.dequeueReusableCellWithIdentifier("FOO", forIndexPath: indexPath) as UITableViewCell

    cell.backgroundColor = UIColor.redColor()
    cell.contentView.backgroundColor = UIColor.greenColor()
10
David H

Swift

cell.separatorInset = UIEdgeInsetsMake(0, 0, cell.frame.size.width, 0)
if (cell.respondsToSelector("preservesSuperviewLayoutMargins")){
        cell.layoutMargins = UIEdgeInsetsZero
        cell.preservesSuperviewLayoutMargins = false
   }

これは私のために働いた

ありがとう

9

これは私のためにトリックをしました:

cell?.layoutMargins = UIEdgeInsetsZero;
cell?.preservesSuperviewLayoutMargins = false
7
lg365

SwiftでUIEdgeInsetSettingsを保持し、ストーリーボードを使用していない場合:

変更前:(デフォルトの動作)

Before, Default Setting

次のコードを追加します。

tableView.separatorInset.right = tableView.separatorInset.left

After, Implemented

5
ericgu

Swift 3以降のUITableViewCellクラスの拡張です

extension UITableViewCell
{
    func removeSeparatorLeftPadding() -> Void
    {
        if self.responds(to: #selector(setter: separatorInset)) // Safety check
        {
            self.separatorInset = UIEdgeInsets.zero
        }
        if self.responds(to: #selector(setter: layoutMargins)) // Safety check
        {
            self.layoutMargins = UIEdgeInsets.zero
        }
    }
}

使用法:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "menuCellID")!
    // .. Your other code
    cell.removeSeparatorLeftPadding()
    return cell
}

これが何らかの助けになることを願っています!

ナレシュ。

0
Naresh Reddy M