it-swarm.com.ru

TableView, показывающий за панелью вкладок

Я обновляю свое приложение для использования iOS 7, и у меня возникла проблема с представлением таблицы. Моя панель вкладок является полупрозрачной. Проблема в том, что, когда я прокручиваю до конца моего табличного представления, часть последней ячейки все еще находится за панелью вкладок. Я хотел бы иметь немного пространства между последней ячейкой и панелью вкладок. Я мог бы исправить это, используя вместо этого непрозрачную панель вкладок, но я хочу сохранить ее прозрачной.

enter image description here

23
raginggoat

Попробуйте установить

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

Внутри контроллера таблицы

39
Johnykutty

Проверьте снимок экрана

enter image description here

Проверьте нижнюю панель и снимите флажок под нижней панелью.

16
CoolMonster

Swift 4.x

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

Swift 3

поместите это в viewDidLoad вашего tableViewController:

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
    }
 }
0
Manu

Это действительно трудно решить проблему без подробной информации или реальных кодов. У меня есть аналогичная проблема tabview за UItabBar в моем проекте. Предлагаемые здесь решения не работают в моем случае. Изучив мои коды, я нашел решение для своего случая.

Вот краткое объяснение моего случая. У меня есть UItabBar в главном окне с двумя кнопками вкладок. В одной вкладке есть представление таблицы. Если пользователь нажимает на строку, подробный вид отображается с помощью контроллера навигации. В подробном представлении панель вкладок скрыта, а панель инструментов показана внизу.

Чтобы вернуть панель вкладок и скрыть панель инструментов при возврате основного вида, я должен явно показать панель вкладок и скрыть панель инструментов в случае 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 и внести изменения во время выполнения. У меня есть 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