На iOS 7 UISearchBar выровнял текст заполнителя?
В iOS 7 UISearchBar текст-заполнитель центрирован, и я хочу отключить его и заставить его всегда придерживаться влево, как раньше.
![enter image description here]()
Существует частный метод setCenterPlaceholder, на разницу и вызов этого с помощью BOOL совершит поездку. https://gist.github.com/nscoding/7220368
Заголовочный файл
@interface NSCodingSearchBar : UISearchBar
// Default by the system is YES.
// https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UISearchBar.h
@property (nonatomic, assign, setter = setHasCentredPlaceholder:) BOOL hasCentredPlaceholder;
@end
Файл реализации
#import "NSCodingSearchBar.h"
// ------------------------------------------------------------------------------------------
@implementation NSCodingSearchBar
// ------------------------------------------------------------------------------------------
#pragma mark - Initializers
// ------------------------------------------------------------------------------------------
- (instancetype)initWithFrame:(CGRect)frame
{
if ((self = [super initWithFrame:frame]))
{
self.hasCentredPlaceholder = YES;
}
return self;
}
// ------------------------------------------------------------------------------------------
#pragma mark - Methods
// ------------------------------------------------------------------------------------------
- (void)setHasCentredPlaceholder:(BOOL)hasCentredPlaceholder
{
_hasCentredPlaceholder = hasCentredPlaceholder;
SEL centerSelector = NSSelectorFromString([NSString stringWithFormat:@"%@%@", @"setCenter", @"Placeholder:"]);
if ([self respondsToSelector:centerSelector])
{
NSMethodSignature *signature = [[UISearchBar class] instanceMethodSignatureForSelector:centerSelector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setTarget:self];
[invocation setSelector:centerSelector];
[invocation setArgument:&_hasCentredPlaceholder atIndex:2];
[invocation invoke];
}
}
@end
Мне интересно, есть ли другой, а не "хакерский путь", который делает то же самое.
Ответы
Ответ 1
Чтобы получить выравнивание по левому краю в iOS7, вы можете добавить пробелы в конец строки-заполнителя. Например:
_searchBar.placeholder = @"Search ";
Обратите внимание, что это нужно делать отдельно для каждой строки поиска и каждого языка.
Можно попытаться написать автоматическое вычисление необходимых пробелов после текста для любого языка, но кажется невозможным прочитать размер рамки searchFarFarFarField
<UISearchBarTextField: 0x1349c160; frame = (0 0; 0 0);
Ответ 2
Я не пробовал его с помощью UISearchBar
, но это работает с UITextField
. Я подклассифицировал его и перевернул leftViewRectForBounds:
, textRectForBounds:
и editingRectForBounds:
, вот код:
- (CGRect)textRectForBounds:(CGRect)bounds {
CGRect inset = CGRectMake(bounds.origin.x + kLeftTextPadding,
bounds.origin.y,
bounds.size.width - kLeftTextPadding,
bounds.size.height);
return inset;
}
Надеюсь, что это поможет.