Через 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
не работает. Знаете ли вы, будет ли это работать? –
@JimThio: Да 'UAppearance' работает хорошо, прочитайте примечание. –