14

iOS 7 UISearchBar では、プレースホルダー テキストが中央に配置されているため、これを無効にして、以前のように常に左に固定したいと考えています。

ここに画像の説明を入力

差分にはプライベート メソッド 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

同じことを行う「ハッキーな方法」以外の方法があるかどうか疑問に思っています。

4

2 に答える 2

3

iOS7 でプレースホルダーを左揃えにするには、プレースホルダー文字列の末尾に空白を追加します。例えば:

_searchBar.placeholder = @"Search                  ";

検索バーと言語ごとに個別に行う必要があることに注意してください。

任意の言語のテキストの後に必要なスペースの自動計算を記述しようとすることができますが、searchBar の textField フレームのサイズを読み取ることは不可能のようです

<UISearchBarTextField: 0x1349c160; frame = (0 0; 0 0);
于 2014-01-19T23:52:08.677 に答える
0

で試したことはありません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;
}

それが役に立てば幸い。

于 2014-01-06T19:39:30.710 に答える