Я пытаюсь создать подкласс 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
вместо явного добавления его, но поведение точно такое же. Обновление кода для соответствия.