iOS14 UIPageControl变化
问题
项目中使用到了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
时会增加一个白色的背景长条。
当backgroundStyle
设置成UIPageControlBackgroundStyleMinimal
时背景会完全贴合UIPageControl
的点。
自定义小圆点的图片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
注意⚠️:这种方法就是将UIPageControl
的frame
的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