web-dev-qa-db-ja.com

iOS 9 UITableViewセパレーターインセット(重要な左マージン)

iOS 9上のUITableViewCell内のUITableViews間のセパレーターに問題があります。かなりの左マージンがあります。 iOS 8で導入された間隔を削除するコードは既にありますが、iOS 9では機能しません。彼らは何か他のものを追加したようです。 layoutMarginsGuide で接続されていると思いますが、まだわかりません。誰かが同様の問題を抱えていて、解決策を見つけましたか?

49
Julian Król

さて、 解決策を見つけました 。そのために必要なことは、UITableViewの存在するインスタンスにフラグcellLayoutMarginsFollowReadableWidthを設定することだけです。

myTableView.cellLayoutMarginsFollowReadableWidth = NO;

私はドキュメントでいくつかの参照を見つけたいと思っていましたが、まだ準備ができていないようです 差分ページでのみ言及

フラグは後方互換性のためにiOS 9で導入されたため、設定する前にチェックを追加する必要があります。

if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
    myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}

Swift 2.0の場合、#availableを使用してiOSバージョンを確認できます。

if #available(iOS 9, *) {
    myTableView.cellLayoutMarginsFollowReadableWidth = false
}

さらに、Xcode 7以上でコンパイルする必要があります。

[〜#〜] edit [〜#〜]

セパレーターがiOS 8まで「細かく」見える場合、これが唯一の必要な修正であることに注意してください。そうでない場合は、もう少し変更する必要があります。 SOでこれを行う方法についての情報を見つけることができます。

69
Julian Król

インターフェイスビルダーで実行する場合。デフォルトのセパレーターインセットはAutomaticです。ドロップダウンを選択して、customに変更します。

enter image description here

27
ArunGJ

Swift 2.2 iOS 9.3

ViewDidLoadで

tableView.cellLayoutMarginsFollowReadableWidth = false

UITableViewDelegatesで

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if cell.respondsToSelector(Selector("setSeparatorInset:")){
        cell.separatorInset = UIEdgeInsetsZero
    }
    if cell.respondsToSelector(Selector("setPreservesSuperviewLayoutMargins:")) {
        cell.preservesSuperviewLayoutMargins = false
    }
    if cell.respondsToSelector(Selector("setLayoutMargins:")){
        cell.layoutMargins = UIEdgeInsetsZero
    }
}
17
H.Yuu

Swift 3.0/4.

tableView.cellLayoutMarginsFollowReadableWidth = false

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: UIView.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
    if cell.responds(to: #selector(setter: UIView.layoutMargins)) {
        cell.layoutMargins = UIEdgeInsets.zero
    }
}
11
derdida

iOS 9までの完璧なソリューション

viewDidLoad

- (void)viewDidLoad {
    [super viewDidLoad];
    //Required for iOS 9
    if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 9.0) {
        self.testTableView.cellLayoutMarginsFollowReadableWidth = NO;
    }
}

TableViewDelegateメソッドで次のコードを追加します:

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

ここでのさまざまな回答に基づいて、Swiftの次のコード行を使用して、セパレーターからギャップを取り除くことができます。

tableView.separatorInset = UIEdgeInsetsZero
tableView.layoutMargins = UIEdgeInsetsZero
cell.separatorInset = UIEdgeInsetsZero
cell.layoutMargins = UIEdgeInsetsZero

しかし、まだテキストの前にこの小さなギャップがあります:

enter image description here

5
codelearner

これはiOS 9で完璧に機能しました。

OBJ-Cの場合

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  { 
        if ([tableView respondsToSelector:@selector(setSeparatorInset:)])
        {
            [tableView setSeparatorInset:UIEdgeInsetsZero];
        }

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

        if ([cell respondsToSelector:@selector(setLayoutMargins:)])
        {
            [cell setLayoutMargins:UIEdgeInsetsZero];
        }
         return cell;
    }
4
jithin

受け入れられた答えは私にはうまくいきませんでした。 setCellLayoutMarginsFollowReadableWidthsetLayoutMarginsの前に移動するまで(iOS 8にはまだ必要):

if([_tableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)]) {
  _tableView.cellLayoutMarginsFollowReadableWidth = NO;
}

if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
  _tableView.layoutMargins = UIEdgeInsetsZero;
}
3
Donnit

IOS 8および9の場合

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if ([UITableView instancesRespondToSelector:@selector(setLayoutMargins:)]) [[UITableViewCell appearance] setLayoutMargins:UIEdgeInsetsZero];
    if ([UITableView instancesRespondToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) [[UITableViewCell appearance] setPreservesSuperviewLayoutMargins:NO];
}

そして

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) [cell setLayoutMargins:UIEdgeInsetsZero];
}
1
Javier Sánchez
- (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];
    }

}
1
Mihawk

これは、XCode 8.2.1のSwift 3.0/iOS 10のソリューションです。

IBで動作し、プログラムでテーブルビューを作成するUITableviewのサブクラスを作成しました。

import UIKit

class EXCSuperTV: UITableView
{
    required init?(coder aDecoder: NSCoder)
    {
        super.init(coder: aDecoder)
        setupView()
    }

    override init(frame: CGRect, style: UITableViewStyle)
    {
        super.init(frame: frame, style: style)
        setupView()
    }

    func setupView() {}
}

class EXCNoFooter: EXCSuperTV
{
    override func setupView()
    {
        super.setupView()
        //tableFooterView = UIView.Zero()
    }
}


class EXCMainTV: EXCNoFooter
{
    override func setupView()
    {
        super.setupView()
        separatorInset = UIEdgeInsets.zero
    }
}
0
Darkwonder