runtime_获取私有属性名
2018-10-23 本文已影响0人
编程_书恨少
一、通过runtime获取私有属性名
runtime可以做的事情太多了,我们一个一个的来讲。
举例:比如现在有一个UIPageControl控件,一般的需求是这样的
Snip20181023_4.png
但是很多时候,UI并不是这样设计的。这里我们就要单独设置UIPageControl的图片,但是我们查看头文件发现,并没有可以进行修改的属性,这个时候有两种办法。第一:自定义UIPageControl,第二:查看私有属性,看是否可以设置。
这里我们通过runtime进行私有属性的查看,发现了可以进行设置的地方
unsigned int count;
Ivar *varA = class_copyIvarList([UIPageControl class], &count);
for (unsigned int i=0; i<count; i++) {
Ivar v = varA[i];
const char *name = ivar_getName(v);
const char *cls = ivar_getTypeEncoding(v);
NSLog(@"----%s----",name);
NSLog(@"----%s----",cls);
}
Snip20181023_6.png
这里就可以通过kvc直接进行设置了
UIPageControl *pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(50, 100, 300, 20)];
pageControl.numberOfPages = 4;
pageControl.currentPage = 0;
// pageControl.currentPageIndicatorTintColor = [UIColor redColor];
// pageControl.pageIndicatorTintColor = [UIColor greenColor];
[pageControl setValue:[UIImage imageNamed:@"aaa"] forKeyPath:@"_currentPageImage"];
[pageControl setValue:[UIImage imageNamed:@"abc"] forKeyPath:@"_pageImage"];
[self.view addSubview:pageControl];
效果是这样的,自己截的图比较丑
Snip20181023_5.png