IOS UITableView contentOffset больше не скрывает заголовок при возврате из расширенного подробного просмотра

#iphone #ios #uitableview #header #hidden

#iPhone #iOS #uitableview #заголовок #скрыто

Вопрос:

Я использую приведенный ниже код в контроллере корневого представления, чтобы скрыть заголовок UITableView (в заголовке есть панель пользовательского поиска). Это работает, когда приложение запускается и отображает TableView.. Однако впоследствии, когда выбрана строка, расширяется подробное представление, и пользователь открывает подробное представление, заголовок uitableview теперь виден в корневом представлении, чего я не ожидал.

Вот соответствующие функции:

 - (void) viewWillAppear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];
    self.tableView.contentOffset 
     = CGPointMake(0, self.tableView.tableHeaderView.frame.size.height);
    //it's as if the line above is ignored on when returning from a pushed detail view    
}

- (void) viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // theContentOffSet works when I put it hear, but then the user can see it which is not desired    
}
  

Строка ‘[self.NavigationController setNavigationBarHidden:YES animated: анимированный];’, безусловно, является частью проблемы, поскольку без нее код работает, и заголовок TableView прокручивается вне поля зрения. Однако для корневого представления требуется, чтобы панель навигации была скрыта, но отображалась в подробном представлении.

Ответ №1:

Некоторое время осмотревшись, я нашел следующий пост https://devforums.apple.com/message/315519#315519 что решает эту проблему.

 -(void)viewWillAppear:(BOOL)animated
{
    [self performSelector:@selector(updateContentOffset) withObject:nil afterDelay:0.0];
}

- (void)updateContentOffset
{
    self.tableView.contentOffset = CGPointMake(0, savedContentOffsetY);
}
  

Конечно, в viewWillDisappear вы можете сохранить смещение содержимого следующим образом:

 savedContentOffsetY = self.tableView.contentOffset.y;
  

И в вашем viewDidLoad ,

 savedContentOffsetY = self.tableView.tableHeaderView.frame.size.height;
  

Комментарии:

1. строка кода, которая у вас есть для viewDidLoad, должна быть «savedContentOffsetY», верно? В противном случае этот код выглядит великолепно, я приму его в качестве ответа, как только смогу его опробовать.

2. Хорошая находка, Камчатка. Похоже, что ‘performSelector’ позволяет обойти некоторые временные проблемы с анимацией, которые у вас есть с viewWillAppear

3. Спасибо, что заметили опечатку, теперь исправлена.

Ответ №2:

У меня есть поиск, и я много пробовал, но ничего не помогло. Наконец, следующий код помог мне. Вы можете добавить код в свой метод viewDidLoad ():

 self.edgesForExtendedLayout = UIRectEdgeNone;