1

Я пытаюсь создать подкласс ViewController, который использует UISearchController для отображения результатов. В представлении есть поле ввода, которое я хочу анимировать до верхней части экрана, чтобы у пользователя было максимальное количество места для просмотра результатов.UISearchBar игнорирует программные ограничения

Я построил доказательство концепции с использованием UIView, которое обертывает компонент Drop-In Search Bar и устанавливает их верхние, ведущие, конечные и нижние ограничения, равные в Storyboard. Следующий код отвечает за анимацию различных движений:

- (void)keyboardWillAppear:(NSNotification*)notification { 
    self.labelToSearchBarSpaceConstraint.active = NO; 
    self.searchBarAtTopConstraint.active = YES; 
    self.searchBarLeadingSpaceConstraint.constant = 0; 
    self.searchBarTrailingSpaceConstraint.constant = 0; 

    [UIView animateWithDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^{ 
     [self.view setNeedsLayout]; 
     [self.view layoutIfNeeded]; 
    }]; 
} 

- (void)keyboardWillDisappear:(NSNotification*)notification { 
    self.searchBarAtTopConstraint.active = NO; 
    self.labelToSearchBarSpaceConstraint.active = YES; 
    self.searchBarLeadingSpaceConstraint.constant = 20; 
    self.searchBarTrailingSpaceConstraint.constant = 20; 

    [UIView animateWithDuration: [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^{ 
     [self.view setNeedsLayout]; 
     [self.view layoutIfNeeded]; 
    }]; 
} 

Затем я попытался переключения к программно созданный UISearchController и UISearchBar. Следующий код устанавливает, что я думал, что было равнозначно отношения в коде, а не в раскадровке:

self.definesPresentationContext = YES; 

self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; 
UISearchBar* searchBar = self.searchController.searchBar; 
searchBar.translatesAutoresizingMaskIntoConstraints = NO; 
[self.searchBarView addSubview:searchBar]; 

[NSLayoutConstraint constraintWithItem:searchBar attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.searchBarView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0].active = YES; 
[NSLayoutConstraint constraintWithItem:searchBar attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.searchBarView attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0.0].active = YES; 
[NSLayoutConstraint constraintWithItem:searchBar attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.searchBarView attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:0.0].active = YES; 
[NSLayoutConstraint constraintWithItem:searchBar attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.searchBarView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0].active = YES; 

Однако, когда сделали этот способ UISearchBar объект не подчиняется ограничениям. Когда контейнер анимируется, строка поиска удаляется с страницы. Почему это происходит?

Незначительное обновление: я заметил в документации для NSLayoutConstraint, чтобы установить его активное свойство на YES вместо явного добавления его, но поведение точно такое же. Обновление кода для соответствия.

ответ

0

У меня была аналогичная проблема при добавлении SearchBar UISearchController в представление заголовка UITableView.

При анимации ограничений контейнераView, содержащего UITableView после того, как пользователь выбрал searchBar, он не будет следовать за контейнером.

В моем случае это может показаться, что после Делегат didPresentSearchController: (UISearchController *) searchController называется, то SearchBar был SuperView из UISearchBarContainerView вместо представления заголовка UITableView.

Повторное добавление его обратно в исходный заголовок перед анимацией помогло мне.

-(void)didPresentSearchController:(UISearchController *)searchController { 

    NSLog(@"did present search controller"); 

    self.tableView.tableHeaderView = self.searchController.searchBar; 

    ...animation... 

}