Изменение размера текстового поля UISearchBar?

У меня есть UITableView с индексом сбоку; Я хочу добавить UISearchBar к нему, но индекс перекрывается с «x», чтобы очистить поиск. Я заметил, что в приложении «Контакты» текстовое поле в UISearchBar изменено для этого, но я не могу понять, как это сделать в моем собственном приложении.

Я пробовал следующее в своем представленииDidLoad, но он, похоже, не работает.

UITextField * textField = (UITextField *)[[self.search subviews] objectAtIndex:0]; CGRect r = textField.frame; [textField setFrame:CGRectMake(r.origin.x, r.origin.y, r.size.height, r.size.width-30)]; 

Есть идеи?

это намного проще, чем все эти предложения. В построителе интерфейсов вместо того, чтобы помещать строку поиска в качестве заголовка вашего представления таблицы, вы можете поместить представление. Затем поместите панель навигации в этот вид. Возьмите левую ручку изменения размера панели навигации и потяните ее вправо до тех пор, пока NB не будет шириной всего 25 пикселей. Очистите заголовок в NB (дважды щелкните его, а затем удалите). Затем добавьте панель поиска в тот же вид. Переместите правую ручку изменения размера влево, отрегулируйте так, чтобы она соответствовала N B. Вот и все.

Вы можете включить кнопку отмены, если хотите, и она также не будет перекрывать индекс (остается в строке поиска).

Очевидно, что в представлении таблицы может быть только 1 subview в своем заголовке, поэтому вам нужно сначала поместить View, затем NB и панель поиска внутри него.

ОБНОВЛЕНИЕ: см. Начало разработки iPhone от Apress, p. 241 версии SDK 3. Вы просто отключите индекс во время поиска.

 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { if (isSearching) { return nil; } return keys; } 

Также они говорят о добавлении увеличительного стекла к вершине индекса.

Отличная книга.

Почему бы просто не сделать реальный UISearchBar меньшим по горизонтали и разместить (пустой) UINavigationBar справа от него? Они будут отображать тот же самый фон.

Лучше взломать внутренние объекты Apple, которые могут измениться.

Кроме того, при анимации ширины UISearchBar вы заметите, что внутреннее текстовое поле не анимируется вместе с ним. Вы можете исправить это, вызвав «layoutSubviews» UISearchBar в своем блоке анимации после изменения его фрейма. (там, где он определяет размер внутреннего текстового поля)

Хорошо, я придумал решение.

  1. Создайте подclass UISearchBar
  2. Включите этот код в метод drawRect:.

     UITextView * textField = [self.subviews objectAtIndex:0]; textField.frame = CGRectMake(5, 6, (310 - kRightSideMargin), 31); [super drawRect:rect]; 

Примечание: kRightSideMargin – это константа, которую я установил в своем файле заголовка; Я установил 25.

Спасибо за предложения от всех остальных.

Как отметил Падрайг, все, что вам нужно сделать, – это подclass из поиска. Создайте подclass 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. Таким образом, если он когда-либо движется в своей линейке subviews, это все равно схватит его. Я нашел 285 достаточно просто, чтобы не перекрываться с индексом моего tableView.

Начиная с iOS 6, решение для навигационной панели не работало хорошо для меня из-за немного разных взглядов между UISearchBar и UINavigationBar. Итак, я переключился на что-то похожее на подход Падрейга, подclassифицировав UISearchBar.

 @interface SearchBarWithPad : UISearchBar @end @implementation SearchBarWithPad - (void) layoutSubviews { [super layoutSubviews]; NSInteger pad = 50; for (UIView *view in self.subviews) { if ([view isKindOfClass: [UITextField class]]) view.frame = CGRectMake (view.frame.origin.x, view.frame.origin.y, view.frame.size.width - pad, view.frame.size.height); } } @end 

Редактирование: Ах, я не пробовал, но я думаю, что вы можете настроить clipToBounds = YES на панели навигации, чтобы отключить ее новую тень, тем самым создав последовательный вид между двумя элементами управления.

Я использую ViewDeck и хочу показать UISearchbar внутри leftController .

Теперь проблема в том, что если я открою левую часть, которая содержит навигацию, правый бит перекрывает мое поле поиска.

Я избавился от этого, написав UISearchBar , текстовое поле всегда будет иметь одинаковую ширину, но в одном случае перекрывается ViewDeck, а в другом случае я скрываю бит ViewDeck, а затем кнопка отмены займет пространство:

Подclassификация UISearchBar

 #import "ViewDeckSearchBar.h" #define kViewDeckPadding 55 @interface ViewDeckSearchBar() @property (readonly) UITextField *textField; @end @implementation ViewDeckSearchBar static CGRect initialTextFieldFrame; - (void) layoutSubviews { [super layoutSubviews]; // Store the initial frame for the the text field static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ initialTextFieldFrame = self.textField.frame; }); [self updateTextFieldFrame]; } -(void)updateTextFieldFrame{ int width = initialTextFieldFrame.size.width - (kViewDeckPadding + 6); CGRect newFrame = CGRectMake (self.textField.frame.origin.x, self.textField.frame.origin.y, width, self.textField.frame.size.height); self.textField.frame = newFrame; } -(UITextField *)textField{ for (UIView *view in self.subviews) { if ([view isKindOfClass: [UITextField class]]){ return (UITextField *)view; } } return nil; } @end 

Класс ViewController

В моем classе навигации мне нужно перезаписать эти два метода UISearchbarDelegate , чтобы перейти на полноэкранный режим с результатами поиска:

 - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{ [self.viewDeckController setLeftSize:0]; // I am also using scopes, which works fine (they fade out when not searching) self.searchBar.scopeButtonTitles = @[@"Food", @"Beverages", @"Misc"]; } -(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{ self.viewDeckController.leftSize = 55; } 

результат

ViewDeck показывает справа:

http://i5.minus.com/jA34MnXVqPZez.png

Поиск в полноэкранном режиме (кнопка и кнопки области анимированы).

http://i2.minus.com/jjKEgXLur1kH6.png

Извините, что перетащил все это снова.

Я хотел, чтобы UISearchBar был короче, и я использую UISearchBarController, но фактически не хочу индекса. Это потому, что у меня есть наложение справа:

Длинная панель поиска

Для этого я подделываю sectionIndex с одним пустым элементом, а затем скрываю его. Вот как я это делаю:

  - (void)hideTableIndex { for (UIView *view in [tableView subviews]) { if ([view isKindOfClass:NSClassFromString(@"UITableViewIndex")]) { view.hidden = YES; } } } - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)aTableView { if (aTableView == self.searchDisplayController.searchResultsTableView) { return nil; } else { [self performSelector:@selector(hideTableIndex) withObject:nil afterDelay:0]; return [NSArray arrayWithObjects:@"", nil]; } } - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index { return 0; } 

Это сокращает UISearchBar и скрывает индекс, поэтому его нельзя использовать (в противном случае небольшая часть будет левее слева от наложения, которое при нажатии на нее будет прокручивать UITableView до вершины). Как это:

alt text

Лучше всего, когда вы используете поиск, вы по-прежнему получаете полосу ширины:

alt text

Просто поместите UIView и поместите панель поиска в этот UIView. UIView должен иметь тот же размер, что и UISearchBar. это сработало для меня.

Текстовое поле, используемое в UISearchBar, является подclassом UITextField, называемым UISearchBarTextField.

AFAIK, нет возможности resize UISearchBarTextField с использованием общедоступного API, а частный API тоже не обнаруживает.

Возможно, вы можете взглянуть на subviews UISearchBarTextField, если он есть.

ОБНОВЛЕНИЕ: Это не так.

ОБНОВЛЕНИЕ 2: Я думаю, вы должны взглянуть на свойство rightView UITextField. Код ниже, хотя он не работает, кажется хорошей отправной точкой:

 UIView *emptyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 25, 25)]; [textField setRightView:emptyView]; [textField setRightViewMode:UITextFieldViewModeAlways]; [emptyView release]; 

Извините за Necroposting, но я нашел другой способ сделать небольшое пространство справа от текстового поля. У меня возникла проблема, что у меня был индексированный tableview с поисковой панелью в качестве первой строки. Теперь индекс и поисковая панель (сделанные в IB, кстати) были перекрывающимися. Он пробовал почти все без успеха. Кажется, что свойства ширины и высоты textifield не отвечают … Поэтому я придумал следующее:

 searchBar.showsCancelButton = YES; UIView *cButton = [searchBar.subviews objectAtIndex:2]; cButton.hidden = YES; 

Я все еще не могу настроить размер пространства, но это делает это сейчас … хотя … довольно странное решение …

Все предоставили способы изменения пользовательского интерфейса. Я обнаружил, как получить одинаковые результаты. Вы должны предоставить следующие две реализации:

  1. Используйте UISearchDisplayController. Что еще более важно, убедитесь, что вы инициализируете его:
 - (id)initWithSearchBar:(UISearchBar *)searchBar contentsController:(UIViewController *)viewController 

Невозможность установить действительный UISearchBar (или передающий ноль) будет препятствовать настройке UITextField для индекса.

  1. Вы должны вернуть действительный массив названий, выполнив:
 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView; 

Если вы вернете нуль, индекс не будет отображаться, а UITextField будет неправильно настроен.

Я отправил отчет Apple об ошибке, предположив, что логично, что требуется только # 2, а не # 1. Я не нашел ничего в Руководстве по человеческому интерфейсу (iPhone HIG), требующего использования UISearchDisplayController.

Ключ состоит в том, чтобы использовать «Панель поиска и поисковый controller», а не «Панель поиска» при использовании Interface Builder.

Это выглядит так, как если бы Apple изменила размер представления (обратите внимание, что индекс анимирован вправо, вне экрана), делая его больше, чем экран.

Я бы предположил, что вам нужно реализовать метод searchBarTextDidBeginEditing: UISearchBarDelegate чтобы вызвать это в соответствующей точке. Это, однако, кажется немного взломанным, возможно, есть лучший способ сделать это.

Еще один пример (хотя и утомительный) – resize панели поиска и заполнить «пробел» навигационной панелью. Работает на меня.

То, что я придумал, не намного лучше. В принципе, я делаю пустой вид с фреймом, который я хочу использовать для панели поиска. Затем я создаю UIToolbar, чтобы идти за панель поиска. Обязательно установите его фрейм в тот же фрейм, что и UIView, за исключением того, что значение Y должно быть равным -1; в противном случае вы получите две границы, нарисованные сверху. Затем создайте свой UISearchBar, но установите ширину фрейма 30 (или что имеет смысл для вашего приложения) меньше, чем UIView. Добавьте их в виде subviews и установите UIView как tableHeaderView.

Я последовал совету Майка, сделав UIView, а затем разместил в нем панель навигации и панель UISearch. Единственная проблема – первый раз, когда панель поиска показывает, что ее фон такой же, как и панель навигации?

Интересно, что если я активирую поиск, то нажмите отменить фон этого «фиксированного» !?

Я использую SDK 3.0, поэтому я удалил элемент UISearchBar, сделанный, когда я перетащил UISearchDisplayController в свой NIB, затем сделал представление, как описано выше, и связал его с владельцем файла и выводом searchBar в controllerе отображения поиска.

Это нормально работает !!!

[searchBar setContentInset:UIEdgeInsetsMake(5, 0, 5, 35)];

  • Алгоритм поиска двух повторяющихся чисел в массиве без сортировки
  • Проверьте, присутствует ли элемент в массиве Bash
  • Как добавить изображение в расширяемый список в parent в android?
  • grep файл, но показывать несколько окружающих линий?
  • Сценарий PowerShell для поиска и замены для всех файлов с определенным расширением
  • Как исключить designer.cs из поиска в Visual Studio
  • Алгоритм дерева суффикса Ukkonen на простом английском языке
  • Реализация бинарного поиска в объектах
  • Найти второй по величине элемент в массиве с минимальным количеством сравнений
  • Функция с тем же именем, но другая подпись в производном classе
  • ASP.NET MVC 2.0 Реализация поиска в jqgrid
  • Давайте будем гением компьютера.