[解決済み] iOS 8 UITableViewのセパレータインセット0が機能しない件
質問
あるアプリで
UITableView
のセパレータインセットはカスタム値に設定されています - Right
0
左
0
. これは
iOS 7.x
しかし
iOS 8.0
セパレーターインセットがデフォルトの
15
を右側に表示します。xibファイルでは、右側が
0
が、まだ正しく表示されません。
を削除するにはどうすればよいですか?
UITableViewCell
セパレータの余白について教えてください。
解決方法は?
iOS 8.0では、セルとテーブルビューにlayoutMarginsプロパティが導入されました。
このプロパティはiOS 7.0では利用できないので、割り当てる前に確認する必要があります!
簡単な方法は、@user3570727 が提案するように、セルをサブクラス化し、レイアウトのマージン プロパティをオーバーライドすることです。しかし、セーフエリアからマージンを継承するようなシステム動作は失われるので、以下の解決策はお勧めしません。
(ObjectiveC)
-(UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero // override any margins inc. safe area
}
(スイフト4.2)です。
override var layoutMargins: UIEdgeInsets { get { return .zero } set { } }
プロパティをオーバーライドしたくない場合、または条件付きで設定する必要がある場合は、このまま読み進めてください。
に加えて
layoutMargins
プロパティに加え、Appleは
プロパティ
を指定すると、テーブルビューのマージン設定がセルに継承されなくなります。このプロパティを設定すると、セルはテーブル・ビューとは独立して独自のマージンを設定できるようになります。これはオーバーライドと考えることができます。
このプロパティは
preservesSuperviewLayoutMargins
に設定し、それを
NO
を指定すると、そのセルの
layoutMargin
の設定を上書きすることができます。
layoutMargin
は、TableViewに設定されています。これは時間の節約にもなりますし (
テーブルビューの設定を変更する必要がありません。
というように、より簡潔です。詳しい説明は、Mike Abdullahの回答を参照してください。
注:以下のものは
セルレベルのマージン設定
Mike Abdullahの回答で表現されている通りです。セルに
preservesSuperviewLayoutMargins=NO
は、テーブルビューがセルの設定を上書きしないようにします。もし、テーブルビュー全体のマージンを一定にしたいのであれば、それに応じてコードを調整してください。
セルの余白を設定します。
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
// Remove seperator inset
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
// Prevent the cell from inheriting the Table View's margin settings
if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
[cell setPreservesSuperviewLayoutMargins:NO];
}
// Explictly set your cell's layout margins
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
Swift 4:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// Remove seperator inset
if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
cell.separatorInset = .zero
}
// Prevent the cell from inheriting the Table View's margin settings
if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
cell.preservesSuperviewLayoutMargins = false
}
// Explictly set your cell's layout margins
if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
cell.layoutMargins = .zero
}
}
を設定します。
preservesSuperviewLayoutMargins
プロパティをNOに設定します。
べきである
テーブルビューがセルの余白を上書きするのを防ぐことができます。場合によっては、正しく機能しないこともあるようです。
すべて失敗した場合、テーブルビューのマージンをブルートフォースで変更することができます。
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
// Force your tableview margins (this may be a bad idea)
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}
Swift 4:
func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Force your tableview margins (this may be a bad idea)
if tableView.responds(to: #selector(setter: UITableView.separatorInset)) {
tableView.separatorInset = .zero
}
if tableView.responds(to: #selector(setter: UITableView.layoutMargins)) {
tableView.layoutMargins = .zero
}
}
...で、完成です。これはiOS 7と8で動作するはずです。
EDITです。
Mohamed Salehから、iOS 9で起こりうる変更について注意を促されました。
テーブルビューの
cellLayoutMarginsFollowReadableWidth
から
NO
は、インセットやマージンをカスタマイズしたい場合に使用します。これはあまりよく知られていません。
このプロパティはiOS 9にしか存在しないので、設定する前に必ず確認してください。
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
Swift 4:
if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
myTableView.cellLayoutMarginsFollowReadableWidth = false
}
(上記のコードは iOS 8 UITableViewのセパレータインセット0が機能しない )
EDIT: ここでは、純粋なInterface Builderのアプローチを紹介します。
注:iOS 11はこの動作の多くを変更し、簡素化しましたので、近日中にアップデートを行います。
関連
-
iOSコンパイルポッドでエラー CocoaPods could not find compatible versions for pod "XXXXX" が報告される。
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] UITableViewの選択を無効にするにはどうすればよいですか?
-
[解決済み] iOSのステータスバーの文字色を変更する方法
-
[解決済み] iOSのバージョンを確認する方法を教えてください。
-
[解決済み] UITableViewの下にある余分なセパレータをなくす
-
[解決済み] Objective-Cで文字列が空かどうかをテストするにはどうすればよいですか?
-
[解決済み] iOS 8で位置情報サービスが利用できない
-
[解決済み] SwiftでURLから画像を読み込む/ダウンロードする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Xcode 6.3 - 現在の iOS Development 証明書または保留中の証明書要求がすでにあります。
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] iOS7でスタイルUITableViewStyleGroupedを持つUITableViewの上部に余分なパディングがあるのはなぜですか?
-
[解決済み] Xcode 6のバグ:Interface Builderファイル内の不明なクラス
-
[解決済み] テキストフィールドを移動する方法(次へボタン/完了ボタン)
-
[解決済み] iphoneアプリのベータテストはどのように行うのですか?
-
[解決済み] コア・データ エンティティの全インスタンスを削除する最短の方法
-
[解決済み] セキュリティで保護されたWebサービスにもアクセスするiOSアプリで、Facebook認証を行うためのデザイン
-
[解決済み】iOS 7でUITableViewのセパレータを修正する方法は?重複
-
[解決済み] UITableViewでセパレータの幅をフルに設定する方法