Подтвердить что ты не робот

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.

4b9b3361

Ответ 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)