iOS 10 系统下UISearchBar编辑超过textField宽度过多文字时 文字下移

iOS 10 系统下UISearchBar编辑超过textField宽度过多文字时 文字下移问题。
正常:


74CA1C95762A55E7F4758F6516F6C472.png

下移:


F2401703961C088C201F755A6C4B7CE9.png

最近遇到一个奇葩问题,UISearchBar设置的导航栏在iOS 10系统下的手机上莫名的出现输入文字过多出现明显文本下移的问题而其他系统下是正常的,然后设置了UISearchBar相关属性都无效,在断点调试UISearchBar中的textField的代理方法发现当文本输入过多时textField的frame往下偏移了3个距离。遍历UISearchBar中的textField拿出后设置文本居中和网上单独解决UITextField文本的方法发现对UISearchBar还是无效,最后在反复调试下还是解决了这个问题。下面是详细的解决方法:

因为为了解决iOS 11 UISearchBar默认的placeholder文本居左的问题 所以顺便自定义UISearchBar。具体方法如下:

#import "MMBaseSearchBar.h"

@interface MMBaseSearchBar : UISearchBar

//修复iOS 10 删除文字光标下移
+(void)sendSearchBar:(UISearchBar *)searchBar

@end
#import "MMBaseSearchBar.h"

@interface MMBaseSearchBar () <UITextFieldDelegate>

@property (nonatomic, assign) CGFloat placeholderWidth;

@end

@implementation JPBaseSearchBar

static CGFloat const searchIconW = 20.0;

static CGFloat const iconSpacing = 10.0;

static CGFloat const placeHolderFont = 15.0;

//适配iOS 11 serchBar
- (void)layoutSubviews {
    [super layoutSubviews];
    for (UIView *view in [self.subviews lastObject].subviews) {
        if ([view isKindOfClass:[UITextField class]]) {
            UITextField *field = (UITextField *)view;
            CGRect rect = CGRectMake(15.0, (self.frame.size.height - 32.0)/2, self.frame.size.width - 30.0, 32.0);
            field.frame = rect;
            field.font = [UIFont systemFontOfSize:14];
            UITextField *baseField = [[UITextField alloc] initWithFrame:rect];
            field = baseField;//修复iOS 10 输入文字很多时 文字位置下移
            [field setBackgroundColor:[UIColor whiteColor]];
            field.textColor = kRGB(51.0, 51.0, 51.0, 1);
            field.borderStyle = UITextBorderStyleNone;
            field.layer.cornerRadius = 2.0f;
            field.layer.masksToBounds = YES;
            [field setValue: kRGB(156.0, 156.0, 156.0, 1) forKeyPath:@"_placeholderLabel.textColor"];
            [field setValue:[UIFont systemFontOfSize:placeHolderFont] forKeyPath:@"_placeholderLabel.font"];
            if (@available(iOS 11.0, *)) {
                // 先默认居中placeholder
                [self setPositionAdjustment:UIOffsetMake((field.frame.size.width-self.placeholderWidth)/2, 0) forSearchBarIcon:UISearchBarIconSearch];
            }
        }
    }
}
//修复iOS 10 删除文字光标下移
+(void)sendSearchBar:(UISearchBar *)searchBar
{
    for (UIView *view in [searchBar.subviews lastObject].subviews) {
        if ([view isKindOfClass:[UITextField class]]) {
            UITextField *field = (UITextField *)view;
            for (UIScrollView *view in field.subviews) {
                if ([view isKindOfClass:[UIScrollView class]]) {
                    CGPoint offset = view.contentOffset;
                    if (offset.y != 0) {
                        offset.y = 0;
                        view.contentOffset = offset;
                    }
                    break;
                }
            }
        }
    }
}

// 开始编辑的时候重置为靠左
- (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, *)) {
        if (textField.text.length > 0) {
            return YES;
        }else{
            [self setPositionAdjustment:UIOffsetMake((textField.frame.size.width-self.placeholderWidth)/2, 0) forSearchBarIcon:UISearchBarIconSearch];
        }
    }
    return YES;
}

// 计算placeholder、icon、icon和placeholder间距的总宽度
- (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;
}

以上是自定义UISearchBar,在自定义UISearchBar的UITextField发现当时解决了UISearchBar输入文字过多下移的问题但是又发现了在删除文字时又出现下移的问题,所以在尝试sendSearchBar:(UISearchBar *)searchBar这个遍历纠正UITextField的UIScrollView的偏移量 开始是打算在UITextField的代理方法中执行纠正方法,但发现并没有解决效果,最后在UISearchBar的代理方法中searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText执行才有效解决此问题。所以为了省时间直接写了个类方法调取。

#pragma mark ---UISearchBarDelegate
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    if (@available(iOS 10.0, *)) {
        [JPBaseSearchBar sendSearchBar:searchBar];
    }
}

以上就是解决iOS 10下UISearchBar文本偏移的问题,如果有人遇到此问题 有更好的解决方法麻烦请告知下,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267