iOS11.0后UISearchBar默认不居中了。参考了这篇文章,封装了一个控件。
直接上效果图。
![](https://img.haomeiwen.com/i7793356/b717bcf149ae4745.gif)
先来看看iOS11后系统自带的UISearchBar。
![](https://img.haomeiwen.com/i7793356/213d38679e4e1da1.png)
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运行却不会
![](https://img.haomeiwen.com/i7793356/e63e490e8fabc6e6.png)
加上这句代码就隔开了。
self.searchTextPositionAdjustment = UIOffsetMake(iconSpacing,0);
或者注释掉也能隔开。
self.textField.borderStyle = UITextBorderStyleNone;
最后附上代码。
如果发现了什么问题,欢迎在评论区22。
网友评论