在iOS 7上如何将UISearchBar的占位符文本左对齐?

14

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

我想知道是否有其他的方法,而不是“Hacky way”,可以实现同样的效果。


最好将代码包含在问题中,而不仅仅是链接到它。 - Gabriele Petronella
你试过这个吗?https://dev59.com/63jZa4cB1Zd3GeqPclOb#19555305 - Markus Rautopuro
我认为这不是一个好主意。你应该尽可能遵循标准。 - anders
请仅返回翻译文本:请查看我的答案,链接为 https://dev59.com/63jZa4cB1Zd3GeqPclOb#25827025 - bdv
2个回答

3

如果你想在iOS7中获得占位符的左对齐,你可以在占位符字符串的末尾添加空格。例如:

_searchBar.placeholder = @"Search                  ";

请注意,每个搜索栏和每种语言都应分别完成此操作。
可以尝试为任何语言编写自动计算文本后所需空格的功能,但似乎无法读取searchBar的textField框架大小。
<UISearchBarTextField: 0x1349c160; frame = (0 0; 0 0);

有什么问题吗?它确实有效,而且很简单,尽管可能看起来有点傻。 - malex
我自己用过这个。现在,如何添加那些空白空间? - user4951
你可以像上面的例子一样,在h之后和"之前输入普通的空格。或者,你可以写不同空白字符的utf-8代码,例如\uXXXX。 - malex
5
iOS 8将修剪占位符周围的空白。 - Pwner
@Pwner - 你可以在搜索字符串的末尾添加\u200B字符 - 这是一个不可见的字符,不被视为空格。因此它仍然是不可见的,但它不会被削减掉。 - jbyrd
不同的屏幕尺寸怎么办? - Sahil_Saini

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;
}

希望能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接