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

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

实现方法,自定义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以前一样的效果了。。
完整代码下载
网友评论
-(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;
}
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;
}
这两个稍微改造了下
placeholderWidth = labelWidth + 10 + 13
其中10为空隙,13为图标宽度