Изменение размера UISearchBar TextField?

30
задан Padraig 17 February 2009 в 13:38
поделиться

14 ответов

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

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

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

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

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

Также говорят о добавлении лупы в начало указателя.

Отличная книга во всем.

30
ответ дан 27 November 2019 в 23:20
поделиться

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

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

0
ответ дан Stephen Darlington 11 October 2019 в 12:59
поделиться

Хорошо, я предложил решение.

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

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

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

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

8
ответ дан Padraig 11 October 2019 в 12:59
поделиться

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

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

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

16
ответ дан Nick Farina 11 October 2019 в 12:59
поделиться

Текстовое поле, используемое в 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];
1
ответ дан Can Berk Güder 11 October 2019 в 12:59
поделиться
searchBar.layoutMargins = UIEdgeInsetsMake(0, 0, 0, rightPad);

Мое старое решение изменения кадра UITextField прекратило работать в iOS 13. Помещение UINavigationBar направо от UISearchBar никогда не работало хорошо на меня, поскольку у них были различные взгляды на вершину и нижнюю часть.

0
ответ дан 27 November 2019 в 23:20
поделиться

Another appraoch (though tedious) would be to resize the search bar and fill the 'gap' with a navigation bar. Works for me.

0
ответ дан 27 November 2019 в 23:20
поделиться

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

0
ответ дан 27 November 2019 в 23:20
поделиться

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

searchBar.showsCancelButton = YES;

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

cButton.hidden = YES;

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

1
ответ дан 27 November 2019 в 23:20
поделиться

Как указал Падрейг, все, что вам нужно сделать является подклассом 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.

6
ответ дан 27 November 2019 в 23:20
поделиться

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

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

Я используя SDK 3.0,

0
ответ дан 27 November 2019 в 23:20
поделиться

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

  1. Используйте UISearchDisplayController Что еще более важно, убедитесь, что вы инициализировали его с помощью:

- (id)initWithSearchBar:(UISearchBar *)searchBar contentsController:(UIViewController *)viewController

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

  1. Вы должны вернуть действительный массив заголовков, выполнив:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;

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

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

1
ответ дан 27 November 2019 в 23:20
поделиться

Все работает отлично!!!

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

0
ответ дан 27 November 2019 в 23:20
поделиться

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

1
ответ дан 27 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: