以下所有内容均为个人观点,转载请注明出处<简书--小蜗牛吱呀之悠悠 >,谢谢!
最近使用UIpagecontrol时发现,在iOS14系统下,旧的方式导致UIpagecontrol的圆点不显示,经过一番研究,提供以下解决方案。
在旧的系统版本下,UIpagecontrol布局如下:
_pageControl.frame = CGRectMake(0, Frame_PAD(476), Frame_PAD(290), 7);
_pageControl.centerX = self.bannerView.centerX;
问题:这段代码,在iOS14以下的设备可以正常布局,可在iOS14的设备上,就出现了圆点不显示的问题,查看树结构发现,并不是控件出了问题,是UIpagecontrol的子视图的布局发生了改变。
背景:从iOS14开始,苹果对UIpagecontrol组件进行了优化,提供了不少新的API,也支持了更多的特效(具体的功能此处不赘述,请查看头文件或者百度)。在众多的特效中,有一个特效是苹果对UIpagecontrol的宽度不再固定死,会随着page的个数去自动调整,同时也会调整小圆点的大小。
基于上述苹果特效的更新,也导致了我们上文中的代码失效。因为我们在设置好UIpagecontrol的frame之后,UIpagecontrol内部绘制的时候,会根据page的个数去调整宽度,将我们设置好的frame修改掉。
解决方案:
1、masonry布局:将frame布局替换成masonry的方式:
不给UIpagecontrol设置宽度的约束,让系统内部去调整,只做高度和位置的限定即可,如下代码:
[_pageControl mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(0);
make.top.offset(Frame_PAD(476));
make.height.offset(7);
}];
2、frame布局:除了实例化UIpagecontrol对象时进行设置frame外,需要在layoutSubviews将系统修改后的frame重新改回来,如下:
- (void)layoutSubviews {
//这句一定要有
[super layoutSubviews];
CGRect frame = self.pageControl.frame;
frame.size.width = [self.pageControl sizeForNumberOfPages:self.pageControl.numberOfPages].width;
frame.origin.x = (Frame_PAD(290) - frame.size.width)/2;
self.pageControl.frame = frame;
self.pageControl.centerX = self.bannerView.centerX;
}
注意:[super layoutSubviews]方法一定要调用,否则frame重新设置的时机不对,不起效果