iOS 14.0 UIPageControl不起效果

2021-08-29  本文已影响0人  刃之剑

在旧的系统版本下,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重新设置的时机不对,不起效果

上一篇下一篇

猜你喜欢

热点阅读