UITableViewでセパレーターの全幅を設定する方法


149

私が持っているUITableViewセパレータは、全幅を持っていないところを。左側の10ピクセル前で終了します。私はこのコードをで遊んでいましたviewDidLoad()

self.tableView.layoutMargins = UIEdgeInsetsZero;

また、ストーリーボードで、カスタムセレクターまたはデフォルトセレクターを選択できる場合。これで、入力されたすべてのセルに全幅セレクターがなくなりましたが、空のセルには全幅があります。

どうすれば修正できますか?


9
UITableViewプロパティがありますseparatorInsetUITableView行セパレーターのインセットをゼロに設定します。またseparatorInset、ストーリーボードから変更することもできます
KRUKUSA 2014年

回答:


220

これは、Xcode 6.4およびSwift 1.2を使用するiOS 8.4〜9.0デバイスで私にとっては機能しました。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = UITableViewCell()


    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero

    return cell
}

Swift 5アップデート:

cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero

なぜこれは私のテーブルを空白のテーブルで削除するのですか?セパレーターは移動しましたが、ボタンが表示されません
Oscar

1
@ジェームス、「空白のテーブルでテーブルを削除しますか?」と説明してください。ボタンをどのように追加しましたか(IB、コード経由)?
MB_iOSDeveloper 2016年

1
とても良い解決策です。しかし、私のケースでは、セルの初期化にコードを直接配置しました。すべてのコントローラーでセパレーターの全幅を使用したかったためです。
Vojta

明らかでない場合は、これはもちろんObjective-Cでも適切な構文の変更で機能します。
cohenadair

1
これらのソリューションはどれもiPadでは機能しません。これはiPhoneでのみ機能します...
Charles Robertson

103

私はこの投稿から答えを得ました:iOS 8 UITableViewセパレータインセット0が機能していません

このコードをあなたの UITableViewController

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

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

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

2
tableViewデリゲートメソッドのみを追加することで機能します
TonyTony

申し訳ありませんが、私は役立たずでした。TableViewDeleagte?を追加するだけで十分だったということです。@TonyTony
Timo Cengiz、

3
私にとって、この方法viewDidLayoutSubviewsは必要ありません
TonyTony、2015年

8以外のIOSバージョンでコードを実行しようとしましたか?多分それは最新のもののために働きます。それ以外の場合はそれが機能することはあなたのために良いです。tableviewデリゲートメソッドを追加するだけで解決しませんでした。@TonyTony
Timo Cengiz

私は両方を使わなければなりませんでした。それぞれを個別に使用してみましたが、成功しませんでした。両方を使用した場合にのみ機能しました。さらに、ビューコントローラーがUITableViewControllerのサブクラスである場合、およびUIViewControllerのサブクラスである場合に、それを試しました。変わりはない。8.1シミュレータで実行していることに注意してください。
Ron

100

あなたの UITableViewCell

Interface BuilderのAttributes Inspectorに移動し、「15」を0に変更します。変更するすべてのセルに対してこれを実行します。

instets

に追加[cell setLayoutMargins:UIEdgeInsetsZero];する必要があるかもしれませんtableViewCell


1
またはそれは奇妙です。UITableViewCellsが表示される行ではこれが機能しました(ありがとう!)が、その下の空の行ではセパレーターが15ピクセルずつインデントされていました。
Mike Gledhill、2016

静的セルを使用している場合は、左のインセットを画像に示すように0に変更するだけです(iOS 10、Xcode 8.3.1で動作)
Ignacio Valdivieso

29

Swift 3の場合:

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.separatorInset = .zero
  tableView.layoutMargins = .zero
}

20
  1. あなたの選択 UITableViewCell
  2. Atributes Inspectorに移動
  3. Separatorに移動し、「カスタムインセット」に変更します。
  4. セットleftおよび/またはrightフィールド。(デフォルトではleft: 15right: 0

それがどのように機能するか見てください(を使用left: 100):

ここに画像の説明を入力してください

結果:

ここに画像の説明を入力してください


1
@Hannah Louisa Carneyによる以前の回答の複製
コンスタンティンサラヴァ

19

UITableViewController2つのインセット設定を継承し、さらにfalse willDisplayCellに設定preservesSuperviewLayoutMarginsする必要がありました。Swiftでは次のようになります。

override func tableView(_tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
        cell.preservesSuperviewLayoutMargins = false
    }
}

preservesSuperviewLayoutMargins = falseデフォルト値はすでにfalseであるため、設定する必要はありません
crubio

2
セルが完全な高さを構成していない場合、これはコントローラーによって表示される「プレースホルダー」セルのセパレーターを調整してセルの下のビューを埋めないことに注意してください。
Tieme

11

セパレータInsetはデフォルトで左から15です。区切りInsetオプションをからautoに変更しcustom、インセットをに設定します0

ここに画像の説明を入力してください


9

iOS 9以降のSwiftの場合

カスタムを使用する場合UITableViewCell

override var layoutMargins: UIEdgeInsets {
    get { return UIEdgeInsetsZero }
    set(newVal) {}
}

次にあなたのためUITableViewviewDidLoad

self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;

これが私のためにそれを修正した唯一の答えです(swift 3に更新)。ただし、セルにデータがある場合は機能します。まだ入力されていない空白のセル(およびこのオーバーライドされたlayoutMargins変数を呼び出していないと思います)の場合、セパレーターはテーブルビューのカスタムセルの全幅を埋めません。その上で何かアイデアはありますか?
RanLearns 2017年

iPhoneでは、セパレータは空のセルで左から数ピクセル、右から数ピクセルだけ終了します。このトリックを使用してマージンをゼロにすることなく、問題はありません。iPadでは本当の問題です-空のセルのセパレーターはテーブルビューの左端から出て、セルの幅の約80%だけです。セルにデータがある場合、セパレーターは依然としてセル幅の80%ですが、セパレーターは20%のところから始まり、テーブルビューの右端まで行きます
RanLearns

1
if #available(iOS 9、*){self.tableView.cellLayoutMarginsFollowReadableWidth = false}を使用して解決策を見つけたので、iPhoneでコードをまったく必要としません。セパレーターはちょうど全幅になります。iPadでは、空のセルには全幅のセパレータがありますが、データが追加されたときに全幅を維持するためにコードが必要です。それ以外の場合は、データがセルに入力されると、セパレーターのない左側に数ピクセルが追加されます。
RanLearns 2017年

1
上記のコメントでコードを入手した場所の回答:stackoverflow.com/a/31538250/428981
RanLearns

9

iPadで問題が発生している人のために-これは、iPhoneと同じ状態になります。その後、separatorInset必要に応じてを調整できます。

tableView.cellLayoutMarginsFollowReadableWidth = false

これは、iOS 10とiOS 11での私の問題でした。iOS11は問題ありませんでしたが、10には異なるマージンがありました。ありがとう!!!
migs647 2018

9

cellForRowAtIndexPathメソッドで使用し、セルのセパレーター仕様を構成します
。iOS9.0以降に最適です。

 cell.separatorInset = UIEdgeInsetsZero;
 cell.layoutMargins = UIEdgeInsetsZero;
 cell.preservesSuperviewLayoutMargins = NO;

8

iOS 9.3およびSwift 2.2でテスト済み。willDisplayCellセルcellForRowAtIndexPathを作成する場所ではなく、セルを表示する直前に呼び出されるコードを配置してください。

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero
}

次のoverrideように、の関数に追加しますUITableViewController

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

5

上記のいずれも、Swift 2.2およびXcode 7.3.1では機能しませんでした。

すべての中で最も単純なソリューションであることが判明しました。コードは必要ありません。インスペクターTableViewCellでレイアウトマージンの値を変更するだけですUITableView


4

Swift 3の場合:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
}

1

viewDidLoad(iOS11テスト- SWIFT 4.1)

試す

tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)


0

これらのソリューションはどれもiPadでは機能しませんが、両方のデバイスをカバーするソリューションを考え出しました。

再利用可能なセル:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    ...[other code]...
    [cell setLayoutMargins:UIEdgeInsetsZero];
    [cell setSeparatorInset:UIEdgeInsetsZero];
    return cell;
}

再利用できないセルの場合:

- (void)removeSeparatorInset:(UITableView*)tableView{
    NSArray *cells = [tableView visibleCells];
    for (UITableViewCell *cell in cells){
        [cell setLayoutMargins:UIEdgeInsetsZero];
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
}

-(void) viewDidLayoutSubviews{
   [super viewDidLayoutSubviews];
   [self removeSeparatorInset:self.tableView];
}

このアプローチをさらに詳しく説明します。

@property(nonatomic) UIEdgeInsets separatorInset;
@property(nonatomic) UIEdgeInsets layoutMargins;

UITableView&はどちらのプロパティも使用できますUITableViewCell。後者は、実際には&のUIView親クラスであるのプロパティです。UITableViewUITableViewCell


1
私が再利用できないセルのために見つけた唯一の実用的な解決策
ミッキー

0

Swift 5、Xcode 11アップデート

これをviewDidLoad()内に配置します

yourTableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

エッジ間セパレータの場合は、左と右の値を0に設定します。

ちなみに、「yourTableView」をtableViewアウトレット名に変更します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.