iOS14 UIPageControl变化

作者: HF_K | 来源:发表于2020-09-27 17:53 被阅读0次

    问题

    项目中使用到了SDCycleScrollView来显示轮播图,升级到iOS 14后发现轮播图上的UIPageControl的小黑点都不显示了;查看相关文档发现,iOS 14增加了新的API,导致UIPageControl无法正常显示。=

    新点

    背景样式backgroundStyle

    /// The default background style that adapts based on the current interaction state.
    UIPageControlBackgroundStyleAutomatic  = 0,
    /// The background style that shows a full background regardless of the interaction
    UIPageControlBackgroundStyleProminent  = 1,
    /// The background style that shows a minimal background regardless of the interaction
    UIPageControlBackgroundStyleMinimal    = 2,
    

    backgroundStyle设置成UIPageControlBackgroundStyleProminent时会增加一个白色的背景长条。

    UIPageControlBackgroundStyleProminent [图片上传中...(iOS14UIPageControl变化_2.jpg-61c92a-1601200082757-0)]

    backgroundStyle设置成UIPageControlBackgroundStyleMinimal时背景会完全贴合UIPageControl的点。

    UIPageControlBackgroundStyleMinimal

    自定义小圆点的图片preferredIndicatorImage

    一般情况下圆点已经能够满足需求,但是有时候希望小圆点是自定义图片。iOS 14中,我们可以通过preferredIndicatorImage来自定义图片了。

    pc.preferredIndicatorImage = [UIImage systemImageNamed:@"sun.max.fill"];//系统图片
    //或者
    pc.preferredIndicatorImage = [UIImage imageNamed:@"flight"];//自定义图片
    
    系统图片
    自定义图片

    每个圆点采用不同图片

    我们可以通过setIndicatorImage:<#(nullable UIImage *)#> forPage:<#(NSInteger)#>设定不同小圆点图片。下面是将第一张图片换成月亮,其他太阳。

    pc.preferredIndicatorImage = [UIImage systemImageNamed:@"sun.max.fill"];
    [pc setIndicatorImage:[UIImage systemImageNamed:@"moon.fill"] forPage:0];
    
    不同图片

    设置每个圆点都不一样

    for (NSInteger page = 0; page < pc.numberOfPages; page ++) {
        [pc setIndicatorImage:[UIImage systemImageNamed:[NSString stringWithFormat:@"%ld.circle",page + 1]] forPage:page];
    }
    
    都不一样

    圆点的个数不再被限制

    iOS 14之后UIPageControl的圆点个数将不再受限制,它会自适应去显示圆点。比如设置40个圆点,当前一页无法展示出全部圆点时,它会分页,后面的点会渐渐变小,当滑到后面是会自动更新到下一页。

    pc.numberOfPages = 40;
    
    圆点个数过

    通过拖拽快速移动圆点allowsContinuousInteraction

    iOS 14当圆点个数过多时,我们可以在小圓點上用拖曳的方式快速移动到某个圆点上。allowsContinuousInteraction是用来控制圆点是否可以被拖拽。当它设置成NO时,我们只能通过点击的方式来移动到对应圆点上。

    pc.allowsContinuousInteraction = YES;
    

    注意⚠️:这些属性都是iOS 14之后才有的所以我们要处理好对应逻辑

    if (@available(iOS 14.0, *)) {
    
    } else {
        // Fallback on earlier versions
    }
    

    三方SDCycleScrollView显示错误

    因为iOS 14以后UIPageControl设置了背景,导致原来的Frame不足以显示下UIPageControl

    方法1
    直接在SDCycleScrollView.m文件代码中加入

    if (@available(iOS 14.0, *)) {
        x = 0;
        size.width = self.sd_width;
    }
    
    方法1g

    注意⚠️:这种方法就是将UIPageControlframe的x设置为0,宽度设置成当前屏幕宽度,这样就可以显示下了。但是这种方法会导致SDCycleScrollViewPageContolAlimentRight这个属性没有作用了。
    方法2
    直接在SDCycleScrollView.m文件代码中加入

     if ([self.pageControl isKindOfClass:[TAPageControl class]]) {
            CGRect pageControlFrame = CGRectMake(x, y, size.width, size.height);
            pageControlFrame.origin.y -= self.pageControlBottomOffset;
            pageControlFrame.origin.x -= self.pageControlRightOffset;
            self.pageControl.frame = pageControlFrame;
        }else{
            self.pageControl.translatesAutoresizingMaskIntoConstraints = NO;
            [[self.pageControl.bottomAnchor constraintEqualToAnchor:self.bottomAnchor constant:-_pageControlBottomOffset] setActive:YES];
            [[self.pageControl.heightAnchor constraintEqualToConstant:self.pageControlDotSize.height] setActive:YES];
            if (_pageControlAliment == SDCycleScrollViewPageContolAlimentRight) {
                if (@available(iOS 14.0, *)) {
                    [[self.pageControl.rightAnchor constraintEqualToAnchor:self.rightAnchor constant:25] setActive:YES];
                }else{
                    [[self.pageControl.rightAnchor constraintEqualToAnchor:self.rightAnchor constant:-_pageControlRightOffset] setActive:YES];
                }
            }else{
                [[self.pageControl.centerXAnchor constraintEqualToAnchor:self.centerXAnchor] setActive:YES];
            }
        }
    
    方法2

    注意⚠️:可以通过Pod引入文件修改,将下载文件放入自己项目根目录下,然后在Podfile文件中加入pod 'SDCycleScrollView', :path => 'SDCycleScrollView/',再执行Pod install即可。

    SDCycleScrollView
    密码:jtv8

    相关文章

      网友评论

        本文标题:iOS14 UIPageControl变化

        本文链接:https://www.haomeiwen.com/subject/swyluktx.html