IOS 7を使用するようにアプリを更新していますが、テーブルビューに問題があります。タブバーは半透明です。問題は、テーブルビューの一番下までスクロールすると、最後のセルの一部がまだタブバーの後ろにあることです。最後のセルとタブバーの間に少しスペースを空けたいです。代わりに不透明なタブバーを使用してこれを修正できますが、半透明にしたいです。
設定してみてください
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.automaticallyAdjustsScrollViewInsets = NO;
テーブルビューコントローラー内
Swift 4.x
let adjustForTabbarInsets: UIEdgeInsets = UIEdgeInsetsMake(0, 0, self.tabBarController!.tabBar.frame.height, 0)
self.yourTableView.contentInset = adjustForTabbarInsets
self.yourTableView.scrollIndicatorInsets = adjustForTabbarInsets
スクリーンショットを確認してください
下のバーの下をチェックし、下のバーの下のチェックを外します
Swift
これをviewDidLoad
のtableViewController
の中に入れてください:
self.edgesForExtendedLayout = UIRectEdge()
self.extendedLayoutIncludesOpaqueBars = false
self.automaticallyAdjustsScrollViewInsets = false
これは私のために働いたものです。カスタム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;
}
このソリューションが気に入っているかどうかはわかりませんが、うまくいきます。
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
}
}
詳細情報や実際のコードなしで問題を解決するのは本当に難しいです。私のプロジェクトの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
}
これは私のために働いています
override func viewDidLoad() { self.edgesForExtendedLayout = UIRectEdge() self.extendedLayoutIncludesOpaqueBars = false }
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のチェックボックスをクリックしてこの問題を修正できる場所)を使用していないため、これが私が見つけた最良の解決策です。