2013-10-24 3 views
3

Не могли бы вы рассказать мне, как правильно выравнивать текст UISearchbar в iOS 7? Я использовал это в iOS6, но теперь он не работает в iOS7:Как правильно выравнивать текст UISearchbar в iOS7

//hacking search bar 
UITextField *searchField; 
for (UIView *subview in self.searchBar.subviews) 
{ 

     if ([subview isKindOfClass:[UITextField class]]) { 
     searchField = (UITextField *)subview; 
     break; 
    } 
} 
if (searchField) { 
    searchField.textAlignment = NSTextAlignmentRight; 
} 

ответ

-3

После игры с подвидами из UISearchBar я нашел это решение, он работает на IOS 6 и прошивка 7

//hacking search bar 
UITextField *searchField; 
for (UIView *subview in self.searchBar.subviews) 
{ 

    //this will work in iOS 7 
    for (id sub in subview.subviews) { 
     if([NSStringFromClass([sub class]) isEqualToString:@"UISearchBarTextField"]) 
     { 
      [sub setTextAlignment:NSTextAlignmentRight]; 
     } 
    } 
    //this will work for less than iOS 7 
    if ([subview isKindOfClass:[UITextField class]]) { 
     searchField = (UITextField *)subview; 
     break; 
    } 
} 
//for less than iOS 7 
if (searchField) { 
    searchField.textAlignment = NSTextAlignmentRight; 
} 
+0

не работает. – jAckOdE

+1

Это потому, что UISearchBarTextField не является прямым подчинением панели поиска. Вы можете получить его и установить правильное выравнивание текста, идя вверх по иерархии с помощью рекурсивного поиска для класса, но это плохая практика. Если Apple снова изменит иерархию классов, она может сломаться. В любом случае он будет устанавливать только выравнивание текста во время его ввода. Заполнитель будет по-прежнему центрироваться, и значок по-прежнему будет выровнен по левому краю. – Ash

+0

Я сделал это рекурсивно, прежде чем выкладывать subviews, а затем subviews subviews, пока не достиг текста. Но поскольку @Ash сказал, что это может сломаться в будущем. –

-2

вы можно попробовать как это также .. searchbar.placeholder = @ "Hai .. whitespace";

+0

Прежде всего, это приведет к тому, что текст «Hai» будет слева, а не справа. Во-вторых, вы никогда не сможете получить это точно, потому что ширина символа «пробел» составляет более одного пикселя. В-третьих, вам нужно будет динамически добавлять и удалять пробелы, когда пользователь вводит текст, что приведет к тому, что текст будет перемещаться вперед и назад неприглядным образом. Наконец, это повлияет только на текст заполнителя. Как только пользователь начнет вводить текст в поле, текст будет выравниваться по левому краю. – Ash

+0

он просит выравнивать по правому краю, а левый выровненный и заполнитель - только для указания не реального текста. –

0

К сожалению, это невозможно сделать безопасно без полного повторного внедрения класса с нуля, поскольку выравнивание текста регулируется внутренними элементами кода объекта, когда пользователь начинает и заканчивает редактирование.

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

Если вы хотите попробовать это, найдите searchTestPositionAdjustment, setPositionAdjustment: forSearchBarIcon :, и searchFieldBackgroundPositionAdjustment. Я не думаю, что это будет очень полезно для вас.

-Ash

-2

способ установить текст прямо выравнивать

searchbar-> атрибут inspector-> Поиск text-> пользовательские offset-> горизонтальная (устанавливается согласно требованию)

0

У меня есть решение этой проблемы. Это немного взломанный и не очень аккуратный, но это трюк.

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

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 

    if([touch.view isDescendantOfView:self.placeHolderTextField]){ 
    return NO; 
    } 

    return YES; 
} 

Примечание: не забудьте включить <UIGestureRecognizerDelegate> в вашем .h файле. Если это не работает, вы всегда можете использовать [self.view sendSubViewToBack:self.placeholderTextField];

Далее я только что установил события, на которых я хочу отобразить местозаполнитель, а когда нет. В viewDidLoad, я просто звоню self.placeHolderTextFiew.placeholder = @"search"

И в

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    if(searchText.length > 0){ 
     self.placeHolderTextfield.placeholder = @""; 
    } else{ 
     self.placeHolderTextfield.placeholder = @"search"; 
    } 
} 

Примечание снова: Убедитесь в том, чтобы включить <UISearchBarDelegate> в вашем файле .h для того, чтобы это работало.

Я также использую tableView, поэтому, когда вызывается метод DidSelectRowAtIndexPath, я также устанавливаю заполнитель в пустую строку.

Надеюсь, это поможет.

1

Слишком поздно, но если кто-то все еще задается вопросом о решении, то вы можете следовать этому.

UITextField *searchTextField = [searchBarController.searchBar valueForKey:@"_searchField"]; 

Вы можете получить поле поиска, используя вышеуказанный код.Теперь просто используйте свойства, которые вы хотите использовать, например.

searchTextField.layer.cornerRadius = 10.0f; 
searchTextField.textAlignment = NSTextAlignmentRight; 
Смежные вопросы