Swift Решение
Это решение предназначается для IOS 8 и выше Swift.
Контроллер корневого представления моего приложения является навигационным контроллером. Первоначально этот навигационный контроллер имеет в своем стеке UIViewController
, который я буду называть контроллером родительского представления.
Когда пользователь нажимает кнопку навигационной панели, контроллер родительского представления переключает между двумя контроллерами детского представления на своем представлении с использованием API-интерфейса (переключение между отображенными результатами и перечисленными результатами). Контроллер родительского представления содержит ссылки на два дочерних контроллера. Второй контроллер детского представления не создается до тех пор, пока пользователь не закроет кнопку переключения. Второй контроллер детского представления - это контроллер табличного представления, и он обнаружил проблему, когда он перекрывает навигационную панель независимо от того, как было установлено ее свойство automaticallyAdjustsScrollViewInsets
.
Чтобы исправить это, я вызываю adjustChild:tableView:insetTop
(показано ниже) после того, как создан контроллер представления дочернего табличного устройства и в методе viewDidLayoutSubviews
контроллера родительского представления.
вид Столик зрения контроллера дочернего и контроллер представления родителя topLayoutGuide.length
передаются adjustChild:tableView:insetTop
способом, как это ...
// called right after childViewController is created
adjustChild(childViewController.tableView, insetTop: topLayoutGuide.length)
Метод adjustChild ...
private func adjustChild(tableView: UITableView, insetTop: CGFloat) {
tableView.contentInset.top = insetTop
tableView.scrollIndicatorInsets.top = insetTop
// make sure the tableview is scrolled at least as far as insetTop
if (tableView.contentOffset.y > -insetTop) {
tableView.contentOffset.y = -insetTop
}
}
Заявление tableView.scrollIndicatorInsets.top = insetTop
настраивает индикатор прокрутки в правой части таблицы, чтобы он начинался чуть ниже навигационной панели. Это тонко и легко упускается из виду, пока вы не узнаете об этом.
следующее: viewDidLayoutSubviews
...
override func viewDidLayoutSubviews() {
if let childViewController = childViewController {
adjustChild(childViewController.tableView, insetTop: topLayoutGuide.length)
}
}
Обратите внимание, что весь приведенный выше код появляется в родительском контроллере представления.
Я понял это с помощью Christopher Pickslay's answer на вопрос «iOS 7 Table view не удается настроить настройку содержимого».
Я делаю что-то подобное в подобной ситуации. К сожалению, это не работает, если у вас есть UIRefreshControl для просмотра таблицы и поворот устройства во время обновления. Кажется, это обновляет вставки самостоятельно - в этом случае ошибочно. – Stefan
Вы правы, мне тоже не нравятся жестко закодированные значения вставки. Может ли это быть сделано с помощью Auto Layout, так как это необходимо только для iOS 7? Как бы выглядело это ограничение и какой метод он мог бы использовать в классе контроллера? – tajmahal
@tajmahal Я абсолютно согласен: мне тоже не нравятся жестко установленные значения. Как я уже сказал, мне не удалось найти другой способ, чтобы поддерживать совместимость с iOS 5. Если вы найдете более чистое решение, обязательно передайте его. Autolayout не будет работать для вставки, потому что вставки не могут быть настроены с автозапуском. –