iOS 8.0では、セルとテーブルビューにlayoutMarginsプロパティが導入されています。
このプロパティはiOS 7.0では使用できないため、割り当てる前に確認する必要があります。
簡単な修正は、セルをサブクラス化し、@ user3570727の提案に従ってレイアウトマージンプロパティをオーバーライドすることです。ただし、セーフエリアからマージンを継承するなどのシステム動作は失われるため、以下の解決策はお勧めしません。
(ObjectiveC)
-(UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero // override any margins inc. safe area
}
(swift 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];
}
}
スウィフト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];
}
}
スウィフト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: モハメド・サレーは私の注意にiOSの9の可能な変化をもたらしたあなたはテーブル表示の設定する必要があるかもしれませんcellLayoutMarginsFollowReadableWidth
にしNO
ますが、インセットや余白をカスタマイズしたい場合。あなたの走行距離は変わるかもしれません、これはあまりよく文書化されていません。
このプロパティはiOS 9にのみ存在するため、設定する前に必ず確認してください。
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
スウィフト4:
if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
myTableView.cellLayoutMarginsFollowReadableWidth = false
}
(iOS 8 UITableViewセパレーターインセット0の上記のコードは機能しません)
編集:これは純粋なインターフェイスビルダーアプローチです:
注:iOS 11はこの動作の多くを変更および簡素化します。近日中にアップデートが提供されます...