【追記】
http://qiita.com/yuya_presto/items/08b0656f67a59c8c2d03#標準スタイルのセルと左右の余白を揃えたい場合 のやり方の方が良さそうです。
UITableView
のseparatorInset
は、テーブルビューの罫線のポジション指定用のプロパティです。
iOS 8の多くの端末の場合、デフォルトでleft: 15
が指定されています。
UIEdgeInsetsZero
を指定して、iOS 6
までのように罫線を左端まで延ばすTipsをよく見かけますが、それは本質では無く、iOSの設定画面のようにラベルの左端から始めるなど、 適切な値に設定する のが望ましいです。
「iOS 8の多くの端末の場合、デフォルトでleft: 15
が指定されています」と書きましたが、iPhone 6 Plusの場合はleft: 20
となっていました。
未検証ですが、iPadの場合も違うのではと思います。
CellのStyleがBasicなど、非Customの時は、ラベルの左マージンも合わせて自動調整してくれます。
一方、Customセルの場合、ラベルの左マージンは自分で設定する必要がありますが、iPhone 5やiPhone 6などの実測値であるleft: 15
を指定すると、iPhone 6 Plusで5 pointのズレが発生してしまいます。
下の図の赤くハイライトされた部分は、UISwitch配置のためにCustomセルになっていますが、このように端末間でズレが発生してしまいます。
(今開発中のPlayer!の実際の設定画面です)
また、仮にこの問題が無いとしても、単なる実測値である数値を指定すると、iOSのバージョン違いなどでズレが発生してしまいそうで、良くないと感じています。
解決策
separatorInset.left
の値をラベルの左マージンに指定
言葉にすると簡単ですが、ちょっとだけ苦労しました。
iPhone 6 Plusで検証したところ、以下の挙動でした。
-
viewDidLoad
のタイミング: 15 -
viewWillAppear
のタイミング: 15 -
viewDidAppear
のタイミング: 20
viewDidAppear
のタイミングでseparatorInset.left
の値をラベルの左マージンに指定すると、15から20に変化してカクッとするのが見えてしまいます。
色々試した結果、 viewDidLayoutSubviewsのタイミング では20の値かつ画面表示前に設定することが出来ました。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
notificationLabelLeft.constant = tableView.separatorInset.left
}
こうすることで、iPhone 6 Plusのズレが解消されるとともに、他の端末でも15
という数値よりも確実な指定方法となりました。
もし、他に良い方法あれば教えてください。
他の解決策
ググってもios - Something is wrong with the iPhone 6 Plus tableView.separatorInset - Stack Overflow程度しか情報が無かったです。
そこの回答は以下のような解決策で、あまり良くないと思ったので、自力で何とかしました( ´・‿・`)
- 端末によって設定値を変える(15 or 20)
- 変化に弱い
-
layoutMargins
をオーバーライド- iPhone 6 Plusの場合も15になってしまい、標準の見た目と食い違ってしまう
- (UIEdgeInsets)layoutMargins
{
return UIEdgeInsetsMake(0, 15, 0, 0);
}