UIRefreshControl, скрытый/скрытый моим UINavigationController UINavigationBar
Я пытаюсь использовать UIRefreshControl
внутри моего UITableViewController
, который сам находится внутри UINavigationController
, у которого свойство hidesNavigationBar
установлено на NO
(так что панель навигации видна).
Работает UIRefreshControl
, но скрывается UINavigationBar
. Я удивлен, что не могу найти никого, кто столкнулся с этой проблемой.
Возможные релевантные моменты:
- Я установил
rootViewController
моего UIWindow
как my UINavigationController
.
- Я установил начальный контроллер представления
UINavigationController
, установив свойство viewControllers
UINavigationController
.
- Подкласс my
UITableViewController
создается с помощью ниба.
- Я создаю экземпляр
UIRefreshControl
в методе viewDidLoad
моего подкласса UITableViewController
. Я устанавливаю свойство refreshControl
подкласса UITableViewController
в этом методе.
-
UIRefreshControl
работает отлично, и я вижу часть его, но он скрыт от моего UINavigationBar
. Это выглядит совершенно нормально, если я установил hidesNavigationBar
в YES
(но я не хочу его скрывать).
Изменить:
Код, используемый для создания и размещения моего UIRefreshControl
:
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self
action:@selector(toggleRefresh:)
forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;
Этот фрагмент кода находится в методе viewDidLoad
моего подкласса UITableViewController
, который является контроллером дочернего представления UINavigationViewController
.
Ответы
Ответ 1
Для тех, кто нацелен на iOS 7, кажется, есть новая проблема, где UIRefreshControl
отображается за UITableView
backgroundView
. Я испытал это как при инициализации UIRefreshControl
программно, так и в раскадровке. Простым обходным решением является обновление zPosition
UIRefreshControl
в viewDidLoad
вашего UITableViewController
:
self.refreshControl.layer.zPosition = self.tableView.backgroundView.layer.zPosition + 1;
Ответ 2
Я нашел реальное решение, вот оно:
У меня есть UIViewController
внутри UINavigationController
с полупрозрачным NavigationBar
. Внутри UIViewController
находится UITableView
.
Я хочу добавить UIRefreshControl
, но когда я это сделаю, он скрыт NavigationBar
, как вы объясните.
Вот мой код, чтобы он работал:
// Add a UITableViewController
self.tblViewController = [[UITableViewController alloc] init];
// Set the UITableView to it
self.tblViewController.tableView = self.tblView;
// Initialize the UIRefreshControl and set it method
self.refreshControl = [[UIRefreshControl alloc] init];
[self.refreshControl addTarget:self action:@selector(refreshTable) forControlEvents:UIControlEventValueChanged];
// Set the RefreshControl to the UITableViewController
self.tblViewController.refreshControl = self.refreshControl;
// Here is the thing ! Just change the contentInset to push down the UITableView content to 64 pixels (StatusBar + NavigationBar)
self.tblView.contentInset = UIEdgeInsetsMake(64.f, 0.f, 0.f, 0.f);
С помощью этого кода ваш UITableViewController
отлично отобразит RefreshControl
и сохранит эффект полупрозрачного NavigationBar
при прокрутке вниз по ячейкам.
Ответ 3
Мне кажется, что это ошибка, потому что это происходит только тогда, когда свойство contentOffset таблицыView равно 0
см. этот вопрос
UIRefreshControl не показывает колючие при вызове beginRefreshing и contentOffset 0
Я исправил это с помощью следующего кода (метод для UITableViewController):
- (void)beginRefreshingTableView {
[self.refreshControl beginRefreshing];
if (self.tableView.contentOffset.y == 0) {
[UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^(void){
self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height);
} completion:^(BOOL finished){
}];
}
}
Ответ 4
Не нажимайте -setTranslucent:
на UINavigationBar
. Затем ваше управление обновлением будет правильно расположено под панелью навигации.
Ответ 5
В iOS 7 self.view находится под навигационной панелью, за исключением того, что вы пишете что-то следующим образом:
self.edgesForExtendedLayout = UIRectEdgeNone; // or UIRectEdgeAll & ~UIRectEdgeTop
или
self.navigationViewController.navigationbar.translucent = NO;
Ответ 6
Используя @Jonathan ответ, я получил эту работу хорошо. Но поскольку я использую раскадровку, я устанавливаю там вставку содержимого так: Что в случае необходимости:
(xcode 6.4)