iOS 修改UIPageControl样式

本文介绍在iOS系统中如何自定义UIPageControl的样式,包括通过运行时获取成员变量及使用KVC方式进行样式修改的方法,并探讨了系统更新带来的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:由于iOS13 系统对一些私有属性的限制,以下的方式不能保证正确性。在iOS13 系统下,UISearchBar 中的视图层级已经更换,UITextField 已经可以外部可用;UITextField 的 _placeholderLabel 成员变量的类型已经不是 UILabel,以往的设置方法已经不能使用。类似的更换非常多,大家还是谨慎使用私有方式进行设置,因此私有 api 具有上架风险,另外就是系统并不会向下兼容地更新。


由于系统并未提供相应的属性和方法让我们修改样式,我们最多只能修改颜色

// 修改颜色
@property(nullable, nonatomic,strong) UIColor *pageIndicatorTintColor;
@property(nullable, nonatomic,strong) UIColor *currentPageIndicatorTintColor;

当我们需要更换样式时,则显得很困难,我们只可能通过KVC间接修改对应的值,前提是系统有相应的成员变量,另外系统可能更换成员变量,这种方式不是很妥当


解决方案

1、寻找成员变量

使用运行时获取到UIPageControl的成员变量

unsigned int count;
Ivar* ivars = class_copyIvarList([UIPageControl class], &count);
for (int i=0; i<count; i++) {
    Ivar ivar = ivars[i];
    NSString* name = [NSString stringWithUTF8String:ivar_getName(ivar)];    // 名称
    NSString* type = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];     // 类型
    NSLog(@"成员变量:%@ -> 类型:%@",name,type);
}

结果:
结果

我们注意到有两个比变量 _currentPageImage 和 _pageImage ,这两个就是我们需要更改的样式,分别对应选中和未选中的样式

2、KVC方式修改

KVC可以修改对象的属性、成员变量,包括私有成员变量

[self.pageControl setValue:[UIImage imageNamed:@"selected"] forKeyPath:@"_currentPageImage"];
[self.pageControl setValue:[UIImage imageNamed:@"normal"] forKeyPath:@"_pageImage"];

3、结果
结果


常见的还是有修改UITextField的_placeholderLabel样式,同样方法,想了解运行时知识的小伙伴的点击这里,运行时的相关应用可以看这里,还有这里


除了上述的 间接的、曲折的修改样式的方法,如果想实现更为优雅或者更为酷炫的样式的话,完全可以自定义控件,掌控性更好,只是稍微麻烦一点而已


补充:

笔者觉得替换为图片时,两个控件的间距太大,试图调整之间的间距,发现系统无法更改其位置和大小,替换的读者需要注意一下,或者有改变位置的方法,希望留言

本Demo使用UICollectionView实现自动无限轮播功能。 主要功能: 1.实现自动轮播,可修改轮播的时间 2.轮播图片可以来自本地,也可来自网络,通过单独的方法进行设置即可。对于加载网络图片时,Demo中使用了YYWebImage,也可自行替换成SDWebImage。 3.重写了和系统UIPageControl一样的功能,可用图片代替PageControl上的点点,也可自定义其颜色以及切换动画。 使用方法:使用方法比较简单。 /** * 加载本地图片Banner */ - (void)setupLocalBannerImageView { NSArray *array = @[@"1.png", @"2.png", @"3.png", @"4.png", @"5.png"]; FFBannerView *bannerVew = [FFBannerView bannerViewWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 200) locationImageArray:array]; bannerVew.timeInterval = 2.0; [self.view addSubview:bannerVew]; } /** * 加载网络图片Banner */ - (void)setupNetWorkBannerImageView { NSArray *array = @[@"http://i3.download.fd.pchome.net/t_960x600/g1/M00/07/09/oYYBAFMv8q2IQHunACi90oB0OHIAABbUQAAXO4AKL3q706.jpg", @"http://images.weiphone.net/attachments/photo/Day_120308/118871_91f6133116504086ed1b82e0eb951.jpg", @"http://benyouhuifile.it168.com/forum/macos/attachments/month_1104/110425215921926a173e0f728e.jpg", @"http://benyouhuifile.it168.com/forum/macos/attachments/month_1104/1104241737046031b3a754f783.jpg"]; FFBannerView *bannerVew = [FFBannerView bannerViewWithFrame:CGRectMake(0, 250, [UIScreen mainScreen].bounds.size.width, 200) netWorkImageArray:array placeHolderImage:nil]; bannerVew.timeInterval = 2.0; bannerVew.pageControlStyle = FFPageControlStyleMiddle; bannerVew.delegate = self; [self.view addSubview:bannerVew]; } 以上方式即可简单使用,如需自定义PageControl也可继承FFAbstractDotView,做些基本的设置即可。 gitHub下载地址:喜欢的朋友请给个星呗! 欢迎各位一起来讨论,有问题请发邮箱270452746@qq.com或者直接加我QQ:270452746进行讨论。谢谢!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值