美文网首页iOS学习笔记
UISearchBar placeholder上移问题

UISearchBar placeholder上移问题

作者: iDeveloper | 来源:发表于2017-10-22 22:36 被阅读161次

    案例:

    UISeachBar的Placeholder上移问题,如下图

    修改placeholder上移

    分析:

    UISeachBar是系统控件未改动过, 所有要修改系统控件.
    UISearchBar并未提供相关API来修改位置.
    UITextField侧提供一下API供重写:

    - (CGRect)placeholderRectForBounds:(CGRect)bounds;
    
    - (void)drawPlaceholderInRect:(CGRect)rect;
    
    

    解决:

    建立UISeachBar子类,从而获取到UISeachBar的子视图UITextField,然后重写

    - (CGRect)placeholderRectForBounds:(CGRect)bounds;
    

    建立UITextField的分类,placeHolder偏移接口

    + (void)load {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            Class class = [self class];
            
            SEL originalSelector = @selector(placeholderRectForBounds:);
            SEL swizzledSelector = @selector(swizzled_placeholderRectForBounds:);
            
            Method originalMethod = class_getInstanceMethod(class, originalSelector);
            Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
            
            BOOL didAddMethod = class_addMethod(class, swizzledSelector,
                                                method_getImplementation(swizzledMethod),
                                                method_getTypeEncoding(swizzledMethod));
            if (!didAddMethod) {
                method_exchangeImplementations(originalMethod, swizzledMethod);
            }
        });
    }
    
    - (CGRect)swizzled_placeholderRectForBounds:(CGRect)rect
    {
        CGRect newRect = rect;
        newRect.origin.y += self.placeHolderOffsetY;
        return [self swizzled_placeholderRectForBounds:newRect];
    }
    
    - (void)setPlaceHolderOffsetY:(float)offsetY {
        objc_setAssociatedObject(self, @selector(placeHolderOffsetY), @(offsetY), OBJC_ASSOCIATION_ASSIGN);
    }
    
    - (float)placeHolderOffsetY {
        NSNumber *typeNum = objc_getAssociatedObject(self, _cmd);
        return typeNum.floatValue;
    }
    

    在子类(例如LMSearchBar)设置placeHolderOffsetY.

    - (void)layoutSubviews {
        
        [self adaptAppearance];
        
        [super layoutSubviews];
    }
    
    - (void)adaptAppearance {
        UITextField*searchField = [self valueForKey:@"_searchField"];
        if (searchField) {
            searchField.placeHolderOffsetY = 1;
        }
    }
    

    这里有个系统问题,iOS8系统会崩溃,要改成OBJC_ASSOCIATION_RETAIN_NONATOMIC,
    验证了浮点型都有这个问题:

    - (void)setPlaceHolderOffsetY:(float)offsetY {
        objc_setAssociatedObject(self, @selector(placeHolderOffsetY), @(offsetY),OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (float)placeHolderOffsetY {
        NSNumber *typeNum = objc_getAssociatedObject(self, _cmd);
        return typeNum.floatValue;
    }
    

    修改后如图:

    修改placeholder上移
    demo戳我

    相关文章

      网友评论

        本文标题:UISearchBar placeholder上移问题

        本文链接:https://www.haomeiwen.com/subject/gehquxtx.html