iOS系统库里的隐藏属性的操作

KVC的方式获取属性并操作

//对UIKit库的UISearchBar的内部属性进行操作
UITextField *textField = [_mSearchBar valueForKey:@"_searchField"];
textField.backgroundColor = [UIColor colorWithRGBHex:0xF1F3F6];
[textField setValue:[UIColor colorWithRGBHex:0x000000 alpha:0.35] forKeyPath:@"_placeholderLabel.textColor"];

(这种方式在iOS13中已经被禁止、UISearchBar在iOS13的层级结构上也做了调整,UISearchBarTextField已经不处于UISearchBar的subviews里,而是再更里面一层。所以考虑递归去读取TextField)

递归获取内部属性并操作

在UIView的分类里添加递归搜索属性的方法,方便对所有UIView的子类进行搜索获取属性。

//深度优先递归、
- (UIView *)recursionFindSubview:(NSString *)name {
    Class class = NSClassFromString(name);
    
    for (UIView *subview in self.subviews) {
        if ([subview isKindOfClass:class]) {
            return subview;
        }else{
            UIView *temp = [subview recursionFindSubview:name];
            if (temp) {   //必须判断是否为nil,否则会导致递归提前结束
                return temp;
            }
        }
    }
    
    return nil;
}

调用:

UIView *searchBarTextField = [_mSearchBar recursionFindSubview:@"UISearchBarTextField"];
searchBarTextField.backgroundColor = COLOR_WHITE;

上面也可以用[_mSearchBar recursionFindSubview:@"UITextField"];来代替,因为递归方法内部的isKindOfClass是判断调用者是否是该类的实例或者是继承于该类的某个子类的实例。
UISearchBarTextField显然是UITextField的子类。

以上是在对UISearchBar使用、修改等过程中的一些小记录。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容