美文网首页OC开发资料收集区
iOS14 UIPageControl 自定义图片

iOS14 UIPageControl 自定义图片

作者: 蜗牛锅 | 来源:发表于2020-10-15 12:02 被阅读0次

    同 iOS 13 更新时的 textField 的 placeHolder 属性一样,iOS 14 更新后,禁止开发者用 KVC 的方式访问 UIPageControl 的 私有属性 pageImage。同时也给出了新的API,preferredIndicatorImage,- (void)setIndicatorImage:(nullable UIImage *)image forPage:(NSInteger)page,直接使用不起作用。

    XHPageControl.h

    #import <UIKit/UIKit.h>
    /**
        自定义UIPageControl圆点大小、以图片展示
     */
    @interface XHPageControl : UIPageControl
    /**
     *  如果直接使用init初始化、可以手动定义以下属性
     *  其中pageSize为空则跟随图片size
     */
    @property (nonatomic)   UIImage * currentImage; // 高亮图片
    @property (nonatomic)   UIImage * defaultImage; // 默认图片
    @property (nonatomic, assign)   CGSize pageSize; // 图标大小
    
    
    - (instancetype)initWithFrame:(CGRect)frame currentImage:(UIImage *)currentImage andDefaultImage:(UIImage *)defaultImage ;
    
    //-(void) updateDots;
    @end
    

    XHPageControl.h

    #import "XHPageControl.h"
    
    @interface XHPageControl()
    
    @property (nonatomic) CGSize size;
    
    @end
    
    @implementation XHPageControl
    
    - (instancetype)initWithFrame:(CGRect)frame currentImage:(UIImage *)currentImage andDefaultImage:(UIImage *)defaultImage {
        
        self = [super initWithFrame:frame];
        self.currentImage = currentImage;
        self.defaultImage = defaultImage;
        return self;
    }
    
    - (instancetype)init {
        self = [super init];
        return self;
    }
    
    - (void)setUpDots {
        
        if (self.currentImage && self.defaultImage) {
            self.size = self.currentImage.size;
        } else {
            self.size = CGSizeMake(kScale_Space(10), kScale_Space(10));
        }
        
        if (self.pageSize.height && self.pageSize.width) {
            self.size = self.pageSize;
        }
        
        for (int i = 0; i < [self.subviews count]; i++) {
            
            UIView *dot = [self.subviews objectAtIndex:i];
            
            [dot setFrame:CGRectMake(dot.frame.origin.x, dot.frame.origin.y, self.size.width, self.size.width)];
            if ([dot.subviews count] == 0) {
                UIImageView *view = [[UIImageView alloc]initWithFrame: dot.bounds];
                [dot addSubview:view];
            };
            UIImageView *view = dot.subviews[0];
            if (i == self.currentPage) {
                if (self.currentImage) {
                    view.image = self.currentImage;
                    dot.backgroundColor = [UIColor clearColor];
                } else {
                    view.image = nil;
                    dot.backgroundColor = self.currentPageIndicatorTintColor;
                }
            } else if (self.defaultImage) {
                view.image = self.defaultImage;
                dot.backgroundColor = [UIColor clearColor];
            } else {
                view.image = nil;
                dot.backgroundColor = self.pageIndicatorTintColor;
            }
        }
    }
    
    - (void)setCurrentPage:(NSInteger)page {
        
        [super setCurrentPage:page];
        
        WS(weakSelf);
        if(@available(iOS 14.0, *)) {  //  兼容iOS 14
        // 因为项目用SDAutoLayout框架布局,需PageControl布局完才能获取到全体的subView。其他布局直接 调用setPageControlImage方法。
            [self setDidFinishAutoLayoutBlock:^(CGRect frame) { 
                [weakSelf setPageControlImage];
            }];
        } else {
            [self setUpDots];
        }
    }
    
    - (void)setPageControlImage {
        
        UIView *fview1 = self;
        
        UIView *subView1 = fview1.subviews.firstObject;
        
        fview1 = subView1;
        
        subView1 = fview1.subviews.firstObject;
        
        fview1 = subView1;
        
        subView1 = fview1.subviews.firstObject;
        
        if(subView1 && [subView1 isKindOfClass:[UIImageView class]]) {
            [self modfinPageControlSubViews:fview1];
        }
    }
    
    - (void)modfinPageControlSubViews:(UIView *)fView {
        
        for(int i = 0; i < [fView.subviews count]; i++)  {
            
            UIImageView *dot = [fView.subviews objectAtIndex:i];
            [dot.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
            dot.backgroundColor = [UIColor clearColor];
            
            UIImageView *imageView = [UIImageView new];
            if (i == self.currentPage) {
                
                imageView.frame = CGRectMake(0, 0, self.currentImage.size.width, self.currentImage.size.height);
                imageView.image = self.currentImage;
                [dot addSubview:imageView];
                
            } else {
                
                imageView.frame = CGRectMake(0, 0, self.defaultImage.size.width, self.defaultImage.size.height);
                imageView.image = self.defaultImage;
                [dot addSubview:imageView];
            }
        }
    }
    
    @end
    

    相关文章

      网友评论

        本文标题:iOS14 UIPageControl 自定义图片

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