iOS11后设置UISearchBar占位符居中

iOS11.0后UISearchBar默认不居中了。参考了这篇文章,封装了一个控件。

直接上效果图。


效果图



先来看看iOS11后系统自带的UISearchBar。

textField后面的颜色太丑了,大多数App都会改掉。粗暴的我直接给删去了。

for (UIView *subView in self.subviews) {          

     if ([subView isKindOfClass:[UIView  class]]) {               

        [[subView.subviews objectAtIndex:0] removeFromSuperview];           

    }       

}


删去后发现背景色变透明。

设置了背景色后圆角怎么不见了???

真是奇奇怪怪。只能设置一下了。

self.textField.backgroundColor = [UIColor whiteColor];   

self.textField.borderStyle = UITextBorderStyleNone;    self.textField.layer.cornerRadius = 5.0f;   

self.textField.layer.masksToBounds = YES;



做完这些后就进入最重要的居中步骤了。

原理是设置 setPositionAdjustment,让textField和searchBar左边偏移。

距离:placeHolder宽度 + icon宽度 + 它们之间的间隙

- (CGFloat)placeholderWidth {   

    if (!_placeholderWidth) {       

        CGSize size = [self.placeholder boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:placeHolderFont]} context:nil].size;       

        _placeholderWidth = size.width + iconSpacing + searchIconW;   

    }   

    return _placeholderWidth;

}


然后在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 (textField.text.length == 0) {       

        if (@available(iOS 11.0, *)) {           

    [self setPositionAdjustment:UIOffsetMake((textField.frame.size.width - self.placeholderWidth) / 2, 0) forSearchBarIcon:UISearchBarIconSearch];     

         }   

    }   

    return YES;

}

设置完发现icon和textField离得很近。

在iOS10运行却不会

加上这句代码就隔开了。

        self.searchTextPositionAdjustment = UIOffsetMake(iconSpacing,0);

或者注释掉也能隔开。

        self.textField.borderStyle = UITextBorderStyleNone;   

最后附上代码。

如果发现了什么问题,欢迎在评论区22。

你可能感兴趣的:(iOS11后设置UISearchBar占位符居中)