web-dev-qa-db-ja.com

Xcode 7 iOS 9 UITableViewCell Separator Insetの問題

これは質問ではなく、私が直面した問題の解決策です。

Xcode 7では、iPadデバイス上のiOS 9でアプリケーションを実行すると、UITableViewセルはテーブルビューの左側にマージンを残します。また、デバイスを横向きに回転させると、マージンが増加します。

私が見つけた解決策は次のとおりです。

「cellLayoutMarginsFollowReadableWidth」をNOに設定します。

self.tbl_Name.cellLayoutMarginsFollowReadableWidth = NO;

このプロパティはiOS 9でのみ使用できるため、iOSバージョンを確認する条件を設定する必要があります。そうしないとクラッシュします。

if(NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_8_1)
{
    self.tbl_Name.cellLayoutMarginsFollowReadableWidth = NO;
}

それが他の人に役立つことを願っています。

68
stuti

iOS 9以降に最適なソリューション

これは、読み取り可能なコンテンツガイドと呼ばれる新しい機能によるものです。読み取りに適したマージンを提供します。そのため、iPhoneおよびポートレートiPadでは、これらは非常に小さなマージンですが、ランドスケープiPadでは、それらは大きくなります。 iOS 9では、UITableViewのセルマージンはデフォルトで読み取り可能なコンテンツガイドに従っています。

それを止めたい場合は、tableViewのcellLayoutMarginsFollowReadableWidthNO/falseに設定するだけです。

出典:https://forums.developer.Apple.com/thread/5496

39
Vizllx

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

viewDidLoad

Objective-C

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

Swift

 override func viewDidLoad() {
    super.viewDidLoad()
    if #available(iOS 9.0, *) {
      tableViewDiet.cellLayoutMarginsFollowReadableWidth = false
    }
  }

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

Objective-C

- (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

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    // Remove seperator inset
    if cell.respondsToSelector(Selector("setSeparatorInset:")) {
      cell.separatorInset = UIEdgeInsetsZero
    }

    // Prevent the cell from inheriting the Table View's margin settings
    if cell.respondsToSelector(Selector("setPreservesSuperviewLayoutMargins:")) {
      cell.preservesSuperviewLayoutMargins = false
    }

    // Explictly set your cell's layout margins
    if cell.respondsToSelector(Selector("setLayoutMargins:")) {
      cell.layoutMargins = UIEdgeInsetsZero
    }
  }
13
Bhuvan Bhatt

少し遅れて。私は他の誰かに役立つことを願っています...

if #available(iOS 9.0, *) {
      myTableView.cellLayoutMarginsFollowReadableWidth = false
}
3
TomCobo

readableContentGuideは、すべてのUIViewに既に追加されているレイアウトガイドです

これは、ユーザーがコンテンツを読むために頭を回す必要がないようにするためです。

読みやすいコンテンツガイドに従う場合は、次の手順を実行します。

let baseSection = UIView()

contentView.addSubview(baseSection)

baseSection.translatesAutoresizingMaskIntoConstraints = false

let insets = UIEdgeInsets(top: 4, left: 0, bottom: 4, right: 0)

baseSection.leadingAnchor.constraint(equalTo: readableContentGuide.leadingAnchor, constant: insets.left).isActive = true
baseSection.trailingAnchor.constraint(equalTo: readableContentGuide.trailingAnchor, constant: -insets.right).isActive = true
baseSection.topAnchor.constraint(equalTo: contentView.topAnchor, constant: insets.top).isActive = true
baseSection.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -insets.bottom).isActive = true

注:上記のコードでは、下部と上部のアンカーでreadableContentGuideの代わりにcontentViewを使用し、コンテンツの垂直マージンがtableView.rowHeightに基づいて変化するようにします。

0
user1046037