今天遇到这个需求,需要修改UIPageControl圆点之间的间距。查资料找到以下两种方法,其一是自定义继承UIPageControl的类,其二是使用runtime交换方法来修改。
文笔不好直接代码记录
法一:继承UIPageControl
#import "HYRPageControl.h"
#define kDotW 30 //圆点的宽度
#define kMagrin 20 //圆点之间的间隔
@interface HYRPageControl ()
@end
@implementation HYRPageControl
#pragma mark - 法一
- (void)layoutSubviews
{
[super layoutSubviews];
//计算圆点尺寸和间距的长度
CGFloat marginX = kDotW + kMagrin;
//计算整个pageControll的宽度
CGFloat newW = self.frame.size.width;//(self.subviews.count - 1 ) * magrin + self.subviews.count *dotW;
//计算左边距
CGFloat leftRight = (newW - ((self.subviews.count - 1 ) * kMagrin + self.subviews.count * kDotW)) / 2;
//设置新frame
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, newW, self.frame.size.height);
//遍历subview,设置圆点frame
for (int i=0; i<[self.subviews count]; i++) {
UIImageView* dot = [self.subviews objectAtIndex:i];
[dot setFrame:CGRectMake(i * marginX + leftRight, dot.frame.origin.y, kDotW, kDotW)];
}
}
@end
运行效果如下图:
法二:使用runtime交换UIPageControl的私有方法
首先找私有的方法或者所有的成员变量。
我本来是在demo中已经输出所有的成员变量了,但是没有发现相关距离的变量。简单看看代码
// runtime:根据模型中属性,去字典中取出对应的value给模型属性赋值
// 1.获取模型中所有成员变量 key
// 获取哪个类的成员变量
// count:成员变量个数
unsigned int count = 0;
// 获取成员变量数组
Ivar *ivarList = class_copyIvarList([UIPageControl class], &count);
for (NSInteger i = 0; i<count; i++) {
// 获取成员变量
Ivar ivar = ivarList[i];
// 获取成员变量名字
NSString *ivarName = [NSString stringWithUTF8String:ivar_getName(ivar)];
// 获取成员变量类型
NSString *ivarType = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
NSLog(@"-----%@--%@",ivarName,ivarType);
}