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使用、修改等过程中的一些小记录。

你可能感兴趣的:(iOS系统库里的隐藏属性的操作)