это намного проще, чем все эти предложения. В конструкторе интерфейса вместо того, чтобы помещать панель поиска в качестве заголовка представления таблицы, вы можете поместить вместо этого представление. Затем поместите панель навигации внутрь этого представления. Возьмитесь за левый маркер изменения размера на панели навигации и потяните его вправо, пока ширина NB не станет всего 25 пикселей. Очистите заголовок в NB (дважды щелкните, чтобы выбрать его, затем удалите). Затем добавьте панель поиска в то же представление. Переместите его правый маркер изменения размера влево, отрегулируйте так, чтобы он примыкал к N B. Вот и все.
Вы также можете включить кнопку отмены, если хотите, и она также не будет перекрывать индекс (остается в строке поиска) .
Очевидно, что табличное представление может иметь только 1 вложенное представление в заголовке, поэтому вам нужно сначала поместить представление, затем NB и панель поиска внутри него.
ОБНОВЛЕНИЕ: см. «Начало разработки iPhone в Apress», стр. 241 редакции SDK 3. Вы просто отключаете указатель во время поиска.
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
if (isSearching) {
return nil;
}
return keys;
}
Также говорят о добавлении лупы в начало указателя.
Отличная книга во всем.
Это вид взглядов, как будто Apple изменяет размер представления (отмечают, что индекс анимирован направо от экрана), делая это больше, чем экран.
я предположил бы, что необходимо будет реализовать searchBarTextDidBeginEditing:
метод UISearchBarDelegate
для инициирования этого в соответствующей точке. Это действительно, однако, чувствует, что немного hacky делает, возможно, существует лучший способ сделать его.
Хорошо, я предложил решение.
, Включают этот код в drawRect: метод.
UITextView * textField = [self.subviews objectAtIndex:0];
textField.frame = CGRectMake(5, 6, (310 - kRightSideMargin), 31);
[super drawRect:rect];
Примечание: kRightSideMargin является константой, которую я установил в своем заголовочном файле; у меня есть он набор к 25.
спасибо за предложения от всех остальных.
Почему не только делают фактический UISearchBar меньшим горизонтально и размещают (пустой) UINavigationBar направо от него? Они представят тот же самый фон.
Лучше, чем взламывание внутренностей объектов Apple, которые могли измениться.
кроме того, при анимации ширины UISearchBar, Вы заметите, что внутреннее текстовое поле не анимировано наряду с нею. Можно зафиксировать это путем вызова "layoutSubviews" UISearchBar в блоке анимации после изменения его кадра. (это - то, где это определяет размер внутреннего текстового поля)
Текстовое поле, используемое в UISearchBar, является подклассом UITextField по имени UISearchBarTextField.
AFAIK, нет никакого способа изменить размер UISearchBarTextField с помощью общедоступного API, и , частный API не показывает много также.
, Возможно, можно смотреть на подпредставления UISearchBarTextField, если это имеет кого-либо.
ОБНОВЛЕНИЕ: Это не делает.
ОБНОВЛЕНИЕ 2: я думаю, что необходимо смотреть на rightView свойство UITextField. Ниже кода, хотя это не работает, походит на хорошую начальную точку:
UIView *emptyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 25, 25)];
[textField setRightView:emptyView];
[textField setRightViewMode:UITextFieldViewModeAlways];
[emptyView release];
searchBar.layoutMargins = UIEdgeInsetsMake(0, 0, 0, rightPad);
Мое старое решение изменения кадра UITextField прекратило работать в iOS 13. Помещение UINavigationBar направо от UISearchBar никогда не работало хорошо на меня, поскольку у них были различные взгляды на вершину и нижнюю часть.
Another appraoch (though tedious) would be to resize the search bar and fill the 'gap' with a navigation bar. Works for me.
То, что я придумал, не намного лучше. По сути, я создаю пустой вид с рамкой, которую хочу использовать для панели поиска. Затем я создаю UIToolbar, чтобы зайти за панель поиска. Обязательно установите его фрейм в тот же фрейм, что и UIView, , за исключением , что значение Y должно быть -1; в противном случае вы получите две границы вверху. Затем создайте свой UISearchBar, но установите ширину фрейма на 30 (или что-то еще, что имеет смысл для вашего приложения) меньше, чем UIView. Добавьте их как subviews и установите свой UIView как tableHeaderView.
Извините за некропостинг, но я нашел другой способ освободить немного места справа от текстового поля. У меня была проблема, что у меня было индексированное табличное представление с панелью поиска в качестве первой строки. Теперь индекс и панель поиска (сделанная в IB, кстати) перекрывались. Он перепробовал почти все, но безуспешно. Кажется, что свойства ширины и высоты текстового поля не отвечают ... Итак, я придумал следующее:
searchBar.showsCancelButton = YES;
UIView *cButton = [searchBar.subviews objectAtIndex:2];
cButton.hidden = YES;
Я все еще не могу отрегулировать размер пространства, но пока это работает ... хотя ... довольно странное решение ...
Как указал Падрейг, все, что вам нужно сделать является подклассом searchBar. Создайте свой подкласс UISearchBar и добавьте следующий код в метод layoutSubviews
:
- (void)layoutSubviews
{
UITextField *searchField;
for(int i = 0; i < [self.subviews count]; i++)
{
if([[self.subviews objectAtIndex:i] isKindOfClass:[UITextField class]])
{
searchField = [self.subviews objectAtIndex:i];
}
}
if(!(searchField == nil))
{
searchField.frame = CGRectMake(4, 5, 285, 30);
}
}
Он просматривает все подпредставления и проверяет их на соответствие типу UITextField. Таким образом, если он когда-либо переместится в свою очередь подпредставлений, он все равно захватит его. Я обнаружил, что 285 - достаточно широкие, чтобы не перекрывать индекс моего tableView.
Я последовал совету Майка, создав UIView, а затем поместил в него панель навигации и панель поиска UISearch. . Проблема только в том, что первый раз отображается панель поиска, ее фон такой же, как и у панели навигации, как правило?
Интересно, если я активирую поиск, а затем щелкаю, чтобы отменить фон этого «исправленного»!?
Я используя SDK 3.0,
Каждый предоставил способы изменить пользовательский интерфейс. Я обнаружил, как получать идентичные результаты. Вы должны предоставить следующие две реализации:
- (id)initWithSearchBar:(UISearchBar *)searchBar contentsController:(UIViewController *)viewController
. Невозможность установить допустимый UISearchBar (или передача nil) предотвратит настройку UITextField для индекса.
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;
Если вы вернете nil, индекс не будет отображаться, и UITextField не будет правильно настроен.
Я отправил отчет об ошибке в Apple, предполагая, что кажется логичным, что требуется только №2, а не №1. Я не нашел ничего в Руководстве по человеческому интерфейсу (iPhone HIG), требующего использования UISearchDisplayController.
Все работает отлично!!!
[searchBar setContentInset:UIEdgeInsetsMake(5, 0, 5, 35)];
Ключ в том, чтобы использовать «Панель поиска и контроллер отображения поиска», а не «Панель поиска» при использовании Interface Builder.