Как сделать пользовательский UISearchBar для iPhone - PullRequest
0 голосов
/ 07 июля 2011

на основе 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 Я понятия не имею об этом. У кого-нибудь есть подсказки?

Ответы [ 3 ]

4 голосов
/ 07 июля 2011

Начиная с 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, где все очень просто.

3 голосов
/ 03 сентября 2013

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

Если вам все еще нужно изменить внешний вид путем взлома подпредставления, вот обновленный фрагмент кода, который будет работать для 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 Мэттом Томпсоном.

0 голосов
/ 28 сентября 2011
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)];
        }
    }

Клавиша возврата Готово работает, но не рамка текстового поля.Зачем?Кстати, мой кадр поиска Bars установлен на 0, 0, 320, 40.

...