2014-02-13 2 views
0

Я попробовал в IOS 7 подклассу UISearchBar, так что держатель места всегда выровнен по левому краю.Почему изменение PlaceHolder влево не работает с этим методом?

Я сделал это:

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    UITextField * tv = self.textField; 

    tv.textAlignment = NSTextAlignmentLeft ; 
} 

Если tv.textAlignment = NSTextAlignmentRight, то мне удается сделать текст справа.

Однако текст, когда UISearchBar пуст, и отображает местозаполнитель, всегда отображается в центре.

Интересно, почему. Я положил его в layoutSubviews метод. Следовательно, он должен быть нарисован каждый раз, когда выполняется управление.

ответ

1

Вы можете попробовать это, используя UIAppearance.

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextAlignment:NSTextAlignmentLeft]; 

Downvoters, пожалуйста, прочитайте это: note from Apple:

Примечание: IOS применяет изменения внешнего вида, когда вид входит в окно, он не меняет внешний вид тем, что уже находится в окне. Чтобы изменить внешний вид представления, находящегося в данный момент в окне, удалите представление из иерархии представлений и верните его обратно.

+0

не работает. Знаете ли вы, будет ли это работать? –

+0

@JimThio: Да 'UAppearance' работает хорошо, прочитайте примечание. –

0

У меня такая же проблема, как и несколько дней назад, но нет способа изменить выравнивание текста заполнителя строки поиска, я тестировал с таким количеством ответов «SO», но никто не работал. Наконец-то я решил со следующим Fixing.

Добавьте белое пространство слева/справа (как вы хотите) из шаблонного текста

if ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.1) { 
    // Load resources for iOS 6.1 or earlier 
    self.searchBar.placeholder = @"hello"; 
} 
else 
{ 
    // Load resources for iOS 7 or later 
    // Add some white space in Left/right *(as you want)* here i added to left 
    self.searchBar.placeholder = @"   hello"; 
} 
+0

Я знаю, что это сработает. Однако почему мое решение не работало? –

+0

@JimThio - я тоже не знаю, почему ваш код не работает, но я знаю, что я борюсь с ним, и я не могу найти настоящую проблему :(так что я исправлю это :) –

+0

Похоже, текстовое поле, отображающее поиск, отличное от текстового поля, отображающего местозаполнитель. –

0

Через TextField подобозрения NSLog в SearchBar, в можно получить такой результат:

<_UISearchBarSearchFieldBackgroundView: 0x8d492e0; frame = (0 0; 304 28); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x8d49410>> - (null), 
<UIImageView: 0x8d488a0; frame = (102.5 7.5; 12.5 12.5); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8d48f80>> - (null), 
<UISearchBarTextFieldLabel: 0x8d4b410; frame = (122.5 1; 181.5 25); text = 'hello000000'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8d4b520>> 
) 

вам может видеть, UISearchBarTextFieldLabel - это пользовательский интерфейс, чтобы показать местозаполнитель, вот «hello000000», который является подклассом UILabel. Поэтому значение textField textBield для textBield не влияет на позицию замещающего элемента напрямую. А компоновка метки-заполнителя обрабатывается текстовым полем SearchBar - (void)layoutSubviews, тогда как вы не можете переопределить внутренний метод textField.

Пользовательский поискБар базы на UIView, добавить свой подкласс UITextField, который переопределяет - (void)layoutSubviews, или даже добавить добавить UILabel, где текст текстового поля пуст, удалить, пока нет. возможно, решение.

Добавьте мой тестовый код:

@interface CustomSearchBar : UIView { 
} 
@end 

@implementation SharedSearchBar 
- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) {   
     _textField = [[SearchTextField alloc] initWithFrame:CGRectMake(10, 6, frame.size.width-20, frame.size.height-12)]; 
     _textField.leftView = UIImageViewNamed(@"search_glass"); 
     [self addSubview:_textField]; 
    } 
    return self; 
} 
@end 

@interface SearchTextField : UITextField 

@end 

@implementation SearchTextField 
- (void)layoutSubviews{ 
    [super layoutSubviews]; 
    for (UIView *subView in self.subviews) { 
     if ([subView isKindOfClass:[UILabel class]]) { 
      UILabel *lb = (UILabel *)subView; 
      lb.textAlignment = UITextAlignmentRight; 
      lb.text = @"123123"; 
      CGRect frame = lb.frame; 
      frame.origin.x = textFiled.frame.size.width-frame.size.width; 
      lb.frame = frame; 
      break; 
     } 
    } 
} 
@end 

This is empty result:

Смежные вопросы