読者です 読者をやめる 読者になる 読者になる

【swift】ios9でUITableViewCellの罫線を左端まで引っ張る方法メモ

はじめに

UITableViewのデフォルトだと、セル間の罫線が画面左から少し離れたところからスタートしているんですね。
今回やりたかったことはこれを画面の左端からスタートさせることです

実装

で、検索するとこの辺に答えっぽいのがあったのですが、自分のアプリではなんかうまく動かなくて、、、

// iOS 7
UITableView.appearance().separatorStyle = .SingleLine
UITableView.appearance().separatorInset = UIEdgeInsetsZero
UITableViewCell.appearance().separatorInset = UIEdgeInsetsZero

// iOS 8
if #available(iOS 8.0, *) {
  UITableView.appearance().layoutMargins = UIEdgeInsetsZero
  UITableViewCell.appearance().layoutMargins = UIEdgeInsetsZero
  UITableViewCell.appearance().preservesSuperviewLayoutMargins = false
}
// iOS 9
if #available(iOS 9.0, *) {
    UITableView.appearance().cellLayoutMarginsFollowReadableWidth = false
}

全体に適用させるサンプルとして上記のようなコードをどこかで見たのですが、これもなぜか動かず、、、
で、なんか、UITableView.appearance()、UITableViewCell.appearance()の部分がios9で動いてなさそうということを発見しました。
ios8だと期待通りに動いてくれるのですが、、、

ちゃんと調べ切れていませんが、ちょっと面倒だけど以下のような処理をViewControllerごとに呼び出したらとりあえず動きました。

func setTableViewAppearance(tableView: UITableView) {
    // iOS 7
    tableView.separatorStyle = .SingleLine
    tableView.separatorInset = UIEdgeInsetsZero
    // iOS 8
    if #available(iOS 8.0, *) {
        tableView.layoutMargins = UIEdgeInsetsZero
    }
    // iOS 9
    if #available(iOS 9.0, *) {
        tableView.cellLayoutMarginsFollowReadableWidth = false
    }
}

func setTableViewCellAppearance(cell: UITableViewCell) {
    // iOS 7
    cell.separatorInset = UIEdgeInsetsZero
    // iOS 8
    if #available(iOS 8.0, *) {
        cell.layoutMargins = UIEdgeInsetsZero
        cell.preservesSuperviewLayoutMargins = false
    }
}

呼び出し元

// UITa leViewにセット
setTableViewAppearance(tableView)

・・・

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
    // UITableViewCellにセット
    self.setTableViewCellAppearance(cell)
    return cell
}

以上です