Как сделать собственный UISearchBar для iPhone

на основе UISearchBar я хочу следующие функции

  1. НЕТ границы, исходная панель поиска имеет текстовое поле с круглым углом. этот код фрагмента может сделать его без рамки, * но есть проблема: если установить, кнопка закладки отображалась, граница кнопки закладки тоже обрезается на 1 пиксель *

     UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(10, 5, 300, 45)];
    
     UITextField *inputField = (UITextField *)[textField.subviews objectAtIndex:0];          
     inputField.backgroundColor = [UIColor clearColor];
    
     inputField.layer.borderWidth = 5.0f;
     inputField.layer.cornerRadius = 14;
     inputField.layer.borderColor = [[UIColor whiteColor] CGColor];
    
  2. пользовательский значок кнопки закладки

  3. заполнитель textColor Я понятия не имею об этом. у кого-нибудь есть подсказки?

person aelam    schedule 07.07.2011    source источник
comment
Проверьте stackoverflow.com/questions/6201406/how-to-custom-uisearchbar   -  person Jhaliya - Praveen Sharma    schedule 07.07.2011


Ответы (3)


Начиная с iOS 5 у вас есть блестящий прокси-сервер UIAppearance, который позволит вам установить все это с помощью одной строки кода, но если вы хотите настроить таргетинг на 4 или ниже, тогда вы создаете свой собственный — у вас будет чтобы создать свой собственный класс представления, ИЛИ сделать некоторые взломы подпредставления. Вы уже начали с этого первого фрагмента, но есть проблема...

«Правильный» способ взлома подпредставления состоит в том, чтобы перебирать массив subviews до тех пор, пока вы не найдете представление, соответствующее тому, которое вы ищете. В этом случае вы хотите сделать что-то вроде:

for(UIView* i in [searchBar subviews) ]{
    if ([i isKindOfClass:[UITextField class]]) {
        //success! do what you want to do and break
        break;
    }
}
//maybe put some code here if you didn't find what you were looking for

Проблема со взломом подпредставления заключается в том, что иерархия представления может измениться в любое время без предупреждения, и внезапно (в лучшем случае) ваше приложение будет выглядеть иначе или (в худшем случае) произойдет сбой. По этой причине я бы порекомендовал создать свой собственный или просто ориентироваться на iOS 5, где все это очень просто.

person Morgan Harris    schedule 07.07.2011

Начиная с iOS 7, решение, предложенное Морганом Харрисом и wagashi больше не работает, так как изменилась иерархия представлений (Morgan Harris уже предупредил нас об этом в своем ответе). Таким образом, условие больше не будет выполняться.

Если вам все еще нужно изменить внешний вид путем взлома подвида, вот обновленный фрагмент кода, который будет работать для iOS 7:

// Make sure the searchbar has subviews
if (searchBar.subviews && searchBar.subviews.count > 0) {
    // Get main searchBar view
    UIView *searchBarView = [searchBar.subviews objectAtIndex:0];
    // Iterate through its subviews
    for (UIView* searchBarSubview in [searchBarView subviews]) {
        // Check for a text field
        if ([searchBarSubview isKindOfClass:[UITextField class]]) {
            // Success. Now you can change its appearance.
            break;
        }
    }
}

Обратите внимание, что вам необходимо заранее проверить версию iOS, если вы также ориентируетесь на более ранние версии.

Если вы можете, вам, вероятно, следует использовать UIAppearance, как это было предложено Morgan Harris. Для вашего удобства здесь ссылка на библиотеку разработчика. Был также хороший сообщение в блоге о UIAppearance от Мэтта Томпсона.

person Dennis    schedule 03.09.2013

NSArray *subviews = [mySearchBar subviews] ;
    for(id subview in subviews) {
        if([subview isKindOfClass:[UITextField class]]) {
            [(UITextField*)subview setReturnKeyType:UIReturnKeyDone];
            [(UITextField*)subview setFrame:CGRectMake(0, 0, 100, 40)];
        }
    }

Клавиша возврата «Готово» работает, но не в рамке текстового поля. Почему? Между прочим, моя рамка Search Bars установлена ​​на 0, 0, 320, 40.

person wagashi    schedule 28.09.2011