iOS11后设置UISearchBar占位符居中

3,175 阅读1分钟

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。