iOS11-UISearchBar居中placeholder和i

作者: antns丶 | 来源:发表于2017-10-13 10:20 被阅读5202次

UISearchBar在ios11上的placeHolder和icon默认居左了。。。

SearchBar-left.png

下面是实现的居中的效果:

SearchBar-Center.png

实现方法,自定义UISearchBar:

//  placeholder 和icon 和 间隙的整体宽度
// @property (nonatomic, assign) CGFloat placeholderWidth;

//  在layoutSubviews里默认先居中
if (@available(iOS 11.0, *)) {
        [self setPositionAdjustment:UIOffsetMake((field.frame.size.width-self.placeholderWidth)/2, 0) forSearchBarIcon:UISearchBarIconSearch];
 } 
       
// 实现textfield的代理方法
// 开始编辑的时候重置为靠左
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
// 继续传递代理方法
     if ([self.delegate respondsToSelector:@selector(searchBarShouldBeginEditing:)]) {
        [self.delegate searchBarShouldBeginEditing:self];
    }
    if (@available(iOS 11.0, *)) {
        [self setPositionAdjustment:UIOffsetZero forSearchBarIcon:UISearchBarIconSearch];
    }
    return YES;
}

// 结束编辑的时候设置为居中
-(BOOL)textFieldShouldEndEditing:(UITextField *)textField {
     if ([self.delegate respondsToSelector:@selector(searchBarShouldEndEditing:)]     {
        [self.delegate searchBarShouldEndEditing:self];
    }
    if (@available(iOS 11.0, *)) {
        [self setPositionAdjustment:UIOffsetMake((textField.frame.size.width-self.placeholderWidth)/2, 0) forSearchBarIcon:UISearchBarIconSearch];
    }
    return YES;
}

这样效果就和ios11以前一样的效果了。。
完整代码下载

相关文章

网友评论

  • 我的名字就这么长:楼主可以看下这个对UISearchBar的封装,https://www.jianshu.com/p/6629dcaf2202,如有冒犯请原谅
  • 我的名字就这么长:说一下个人拙见 如果实现了UISearchBarDelegate 的这两个方法,应该以这两个代理方法的返回值为准吧,而不应该直接返回YES,否则这两个代理方法就没实际用处了
    -(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
    {
    if ([self.delegate respondsToSelector:@selector(searchBarShouldBeginEditing:)]) {
    BOOL begin = [self.delegate searchBarShouldBeginEditing:self];
    if (begin) {
    if (@available(iOS 11.0, *)) {
    [self setPositionAdjustment:UIOffsetZero forSearchBarIcon:UISearchBarIconSearch];
    }
    }
    return begin;
    }

    if (@available(iOS 11.0, *)) {
    [self setPositionAdjustment:UIOffsetZero forSearchBarIcon:UISearchBarIconSearch];
    }

    return YES;
    }

    -(BOOL)textFieldShouldEndEditing:(UITextField *)textField
    {
    if ([self.delegate respondsToSelector:@selector(searchBarShouldEndEditing:)]){
    BOOL end = [self.delegate searchBarShouldEndEditing:self];

    if (end) {
    if (@available(iOS 11.0, *)) {
    if (textField.text.length==0) {
    [self setPositionAdjustment:UIOffsetMake((textField.frame.size.width-self.placeholderWidth)/2, 0) forSearchBarIcon:UISearchBarIconSearch];
    }
    }
    }
    return end;
    }

    if (@available(iOS 11.0, *)) {
    if (textField.text.length==0) {
    [self setPositionAdjustment:UIOffsetMake((textField.frame.size.width-self.placeholderWidth)/2, 0) forSearchBarIcon:UISearchBarIconSearch];
    }
    }

    return YES;
    }
    Alan龙马:改得好:+1:
  • 因为太有钱:提点建议
    1: UITextField *searchField = [self valueForKey:@"searchField"];
    可以直接拿到 UITextField 不用循环遍历了
    2:如果用户输入文字之后,就不会居中了 因为你设置的是占位符的居中
    - (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    if ([self.delegate respondsToSelector:@selector(searchBarShouldEndEditing:)]) {
    [self.delegate searchBarShouldEndEditing:self];
    }
    if (@available(iOS 11.0, *)) {
    if (textField.text.length) {
    [self setPositionAdjustment:UIOffsetMake((textField.frame.size.width-[self placeholderWidth:textField.text])/2, 0) forSearchBarIcon:UISearchBarIconSearch];
    }else{
    [self setPositionAdjustment:UIOffsetMake((textField.frame.size.width-[self placeholderWidth:self.placeholder])/2, 0) forSearchBarIcon:UISearchBarIconSearch];
    }
    }
    return YES;
    }
    - (CGFloat)placeholderWidth:(NSString *)text {
    CGSize size = [text boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:placeHolderFont]} context:nil].size;
    CGFloat placeholderWidth = size.width + iconSpacing + searchIconW;
    return placeholderWidth;
    }

    这两个稍微改造了下
  • 04a0fd07885c:在layoutSubviews中 根据 searchField.isEditing的状态来设置setPositionAdjustment就可以了。placeholderWidth的宽度可以根据searchField的subViews中对应Label的width,
    placeholderWidth = labelWidth + 10 + 13
    其中10为空隙,13为图标宽度
  • 流年啊奈我何:为什么[self setPositionAdjustment:这一点东西,在我的xcode根本就不会识别
  • Ericydong:placeholder 和icon 和 间隙的整体宽度 这个宽度是怎么获取到的?
    野生马塞洛:@Dimon_Hu field.borderStyle = UITextBorderStyleNone 注释了就行
    Dimon_Hu:@Fefree 你好,代码里的那个我看了看,发现placeholder和icon挨得太近了。没法调整。
    antns丶:代码里有。
  • a8889ac76789:首先感谢博主的分享,不过提个小建议,在 UITextField 的代理方法中,最好能够将 searchBarShouldBeginEditing 的返回值作为结果返回给 UITextField 的代理。
  • SwordDevil:哥们 除了这种方法解决以外 还有没有其他的方法了

本文标题:iOS11-UISearchBar居中placeholder和i

本文链接:https://www.haomeiwen.com/subject/hpniyxtx.html