ios SDCycleScrollView 轮播图为SDCycleScrollViewPageContolStyleClassic模式时分页符显示不全

320 阅读1分钟

原因分析:

原因是由于:UIPageControl在 ios 14之后有了变化导致按照框架中的计算宽度方法计算不准确导致的。解决方法需要在SDCycleScrollView.m文件中的layoutSubviews方法中在对UIPageControl进行宽度计算的时候加入对ios 14及以上系统版本的适配代码,大致位置为第513行代码的地方。

解决方法:

  • 需要适配的代码如下:
        if (@available(iOS 14.0, *)) {

            if ([self.pageControl isKindOfClass:[UIPageControl class]]) {

                UIPageControl *pageControl = (UIPageControl *)_pageControl;

                size.width = [pageControl sizeForNumberOfPages:self.imagePathsGroup.count].width;

            }

        }
  • pod导入的话就直接更新到最新版本即可。

  • 手动拖入项目中解决方案:不好找的话就把下边的layoutSubviews方法和SDCycleScrollView.m文件中的layoutSubviews方法进行替换。

- (void)layoutSubviews

{

    self.delegate = self.delegate;
    [super layoutSubviews];
    _flowLayout.itemSize = self.frame.size;
    _mainView.frame = self.bounds;

    if (_mainView.contentOffset.x == 0 &&  _totalItemsCount) {

        int targetIndex = 0;

        if (self.infiniteLoop) {

            targetIndex = _totalItemsCount * 0.5;

        }else{

            targetIndex = 0;

        }

        [_mainView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:targetIndex inSection:0] atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
    }
    CGSize size = CGSizeZero;

    if ([self.pageControl isKindOfClass:[TAPageControl class]]) {

        TAPageControl *pageControl = (TAPageControl *)_pageControl;

        if (!(self.pageDotImage && self.currentPageDotImage && CGSizeEqualToSize(kCycleScrollViewInitialPageControlDotSize, self.pageControlDotSize))) {

            pageControl.dotSize = self.pageControlDotSize;

        }

        size = [pageControl sizeForNumberOfPages:self.imagePathsGroup.count];

    } else {

        size = CGSizeMake(self.imagePathsGroup.count * self.pageControlDotSize.width * 1.5, self.pageControlDotSize.height);

        // ios14 需要按照系统规则适配pageControl size

        if (@available(iOS 14.0, *)) {

            if ([self.pageControl isKindOfClass:[UIPageControl class]]) {

                UIPageControl *pageControl = (UIPageControl *)_pageControl;

                size.width = [pageControl sizeForNumberOfPages:self.imagePathsGroup.count].width;

           }

        }
    }

    CGFloat x = (self.sd_width - size.width) * 0.5;
    if (self.pageControlAliment == SDCycleScrollViewPageContolAlimentRight) {
        x = self.mainView.sd_width - size.width - 10;
    }
    CGFloat y = self.mainView.sd_height - size.height - 10;
    if ([self.pageControl isKindOfClass:[TAPageControl class]]) {
        TAPageControl *pageControl = (TAPageControl *)_pageControl;
        [pageControl sizeToFit];
    }
    CGRect pageControlFrame = CGRectMake(x, y, size.width, size.height);
    pageControlFrame.origin.y -= self.pageControlBottomOffset;
    pageControlFrame.origin.x -= self.pageControlRightOffset;
    self.pageControl.frame = pageControlFrame;
    self.pageControl.hidden = !_showPageControl;
    if (self.backgroundImageView) {
        self.backgroundImageView.frame = self.bounds;
    }
}