web-dev-qa-db-ja.com

タブバーの後ろに表示されるTableView

IOS 7を使用するようにアプリを更新していますが、テーブルビューに問題があります。タブバーは半透明です。問題は、テーブルビューの一番下までスクロールすると、最後のセルの一部がまだタブバーの後ろにあることです。最後のセルとタブバーの間に少しスペースを空けたいです。代わりに不透明なタブバーを使用してこれを修正できますが、半透明にしたいです。

enter image description here

25
raginggoat

設定してみてください

self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.automaticallyAdjustsScrollViewInsets = NO;

テーブルビューコントローラー内

40
Johnykutty

Swift 4.x

let adjustForTabbarInsets: UIEdgeInsets = UIEdgeInsetsMake(0, 0, self.tabBarController!.tabBar.frame.height, 0)
self.yourTableView.contentInset = adjustForTabbarInsets
self.yourTableView.scrollIndicatorInsets = adjustForTabbarInsets
18
Hemang

スクリーンショットを確認してください

enter image description here

下のバーの下をチェックし、下のバーの下のチェックを外します

17
CoolMonster

Swift

これをviewDidLoadtableViewControllerの中に入れてください:

self.edgesForExtendedLayout = UIRectEdge()
self.extendedLayoutIncludesOpaqueBars = false
self.automaticallyAdjustsScrollViewInsets = false
7
mehdok

Swift 3.0

これは私のために働いたものです。カスタムViewControllerで:

override func viewDidLoad() {
    super.viewDidLoad()

    let adjustForTabbarInsets: UIEdgeInsets = UIEdgeInsetsMake(self.tabBarController!.tabBar.frame.height, 0, 0, 0);
    //Where tableview is the IBOutlet for your storyboard tableview.
    self.tableView.contentInset = adjustForTabbarInsets;
    self.tableView.scrollIndicatorInsets = adjustForTabbarInsets;
}
6
kemicofa

このソリューションが気に入っているかどうかはわかりませんが、うまくいきます。

IOS 11では問題はありません。viewDidLoad()で次を使用します。

self.collectionView.bottomAnchor.constraint(self.view.safeAreaLayoutGuide.bottomAnchor).isActive = true

ただし、iOS 10では、次のようにハックする必要があります。

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    let tabBarHeight: CGFloat = (self.parent?.tabBarController?.tabBar.frame.size.height)!

    if #available(iOS 11.0, *) {

    } else {
        self.collectionView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -tabBarHeight).isActive = true
    }
 }
1
Manu

詳細情報や実際のコードなしで問題を解決するのは本当に難しいです。私のプロジェクトのUItabBarの背後にあるタブビューの同様の問題があります。私の場合、ここで提供されるソリューションは機能しません。私のコードを調べた後、私は私のケースの解決策を見つけました。

ここに私のケースの簡単な説明があります。メインビューに2つのタブボタンがあるUItabBarがあります。 1つのタブビューには、テーブルビューがあります。ユーザーが行をタップすると、Navigation Controllerを使用して詳細ビューが表示されます。詳細ビューでは、タブバーが非表示になり、ツールバーが下部に表示されます。

メインビューに戻ったときにタブバーを戻し、ツールバーを非表示にするには、viewWillAppearのイベントで明示的にタブバーを表示し、ツールバーを非表示にする必要があります。

class myMainViewController: UITableViewController {
  private var tabBarHidden: Bool? = {
    didSet {
      self.tabBarController?.tabBar.isHidden = tabBarIsHidden ?? true
    }
  }

  private var toolBarIsHidden: Bool? {
    didSet {
      let hidden = toolBarIsHidden ?? true
        self.navigationController?.toolbar.isHidden = hidden
        self.navigationController?.setToolbarHidden(hidden, animated: true)
      }
  }
  ...
  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    self.tabBarIsHidden = false
    self.toolBarIsHidden = true
  }
  ...
}

最後に、viewWillAppearのイベントで下部のバーの可視性が設定されていることに気付きました。その時点で、tableViewまたはスクロールビューのコンテンツインセットは、下部にバーがないことに基づいて既に設定されています。だからこそ、私のtableViewは一番下のバーの後ろにあります。

私が見つけた解決策は、viewDidAppearのイベントでコンテンツインセットをリセットすることです:

override func viewDidAppear(_ animated: Bool) {
  // In the event of viewWillAppear, visibilities of tool bar and tab bar are set or changed,
  // The following codes resets scroll view's content insets for tableview
  let topInset = self.navigationController!.navigationBar.frame.Origin.y +
    self.navigationController!.navigationBar.frame.height
  let adjustForTabbarInsets: UIEdgeInsets = UIEdgeInsetsMake(
        topInset, 0,
        self.tabBarController!.tabBar.frame.height, 0)
  self.tableView.contentInset = adjustForTabbarInsets
  self.tableView.scrollIndicatorInsets = adjustForTabbarInsets
}
0
David.Chu.ca

これは私のために働いています

override func viewDidLoad() { self.edgesForExtendedLayout = UIRectEdge() self.extendedLayoutIncludesOpaqueBars = false }

0
Sreeraj VR

UITabBarの背後にビューが表示されている場合、bottomLayoutGuideを取得して実行時に調整できます。私がしているのは、すべてのView Controllerが継承するBaseViewControllerを持っていることです。次に、タブバーが表示されている場合、次のようにビューを調整します。

import UIKit

class BaseVC: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewDidLayoutSubviews() {
    //Ensures that views are not underneath the tab bar
    if tabBarController?.tabBar.hidden == false {
        var viewBounds = self.view.bounds;
        var bottomBarOffset = self.bottomLayoutGuide.length;
        self.view.frame = CGRectMake(0, 0, viewBounds.width, viewBounds.height - bottomBarOffset)
    }
  }
}

私はストーリーボード(IBのチェックボックスをクリックしてこの問題を修正できる場所)を使用していないため、これが私が見つけた最良の解決策です。

0
Spentak