ios图片轮播效果

代码地址如下:
http://www.demodashi.com/demo/11959.html

ImageCarousel

简单封装的图片轮播器
内存过大由于我加载的图片分辨率较高(4k)

文件目录

使用

初始化自定义view,并提供title和图片数组,设置控制器代理

shufflingView *myView = [[shufflingView alloc]
                         initWithFrame:CGRectMake(0, 100, [UIScreen mainScreen].bounds.size.width,
                                                  230)];
    
    
    NSArray *picDataArray = @[ @"1", @"2", @"3", @"4", @"5" ];
    NSArray *titleDataArray = @[ @"1", @"2", @"3", @"4", @"5" ];
    
    myView.picDataArray = [picDataArray copy];
    
    myView.titleDataArray = [titleDataArray copy];
    
    myView.titleLabelTextColor =
    [UIColor colorWithRed:255/255 green:0 blue:0 alpha:1.0];
    
    myView.isAutomaticScroll = YES;
    
    myView.automaticScrollDelay = 2;
    
    myView.carouselViewStyle = ImageCarouselStyleBoth;
    
    myView.pageIndicatorTintColor = [UIColor colorWithRed:255/255 green:0/255 blue:255/255 alpha:1.0];
    
    myView.pageControlCurrentColor =
    [UIColor colorWithRed:0/255 green:255/255 blue:255/255 alpha:1.0];
    
    myView.delegate = self;
    
    myView.picDataArray = [picDataArray copy];
    
    [self.view addSubview:myView];

自定义view


typedef NS_ENUM(NSInteger, ImageCarouselStyleType) {
    ImageCarouselStyleNone,
    ImageCarouselStyleTitle,
    ImageCarouselStylePageControl,
    ImageCarouselStyleBoth
};
@protocol CarouselViewDelegate <NSObject>

@optional

- (void)didClick:(NSInteger)index;

@end

@interface shufflingView : UIView
{
    float _automaticScrollDelay;
    ImageCarouselStyleType _carouselViewStyle;
}
@property(nonatomic, strong) NSArray *picDataArray;
@property(nonatomic, strong) NSArray *titleDataArray;
@property(nonatomic, weak) UIFont *titleLabelTextFont;
@property(nonatomic, weak) UIColor *titleLabelTextColor;
@property(nonatomic, weak) UIColor *pageIndicatorTintColor;
@property(nonatomic, weak) UIColor *pageControlCurrentColor;

// 是否自动滚动
@property(nonatomic, assign) BOOL isAutomaticScroll;
// 滚动时间间隔
@property(nonatomic, assign) float automaticScrollDelay;
/// 枚举
@property(nonatomic, assign) ImageCarouselStyleType carouselViewStyle;

@property(nonatomic, weak) id<CarouselViewDelegate> delegate;

采用一个scrollivew和三个imageview

// 默认滚动到中间imageview
    [_mainScrollView setContentOffset:CGPointMake(self.bounds.size.width, 0)
                             animated:NO];
    
    // 添加三个imageView
    _leftImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, KViewW, KViewH)];
    _rightImageView = [[UIImageView alloc]initWithFrame:CGRectMake(2*KViewW, 0, KViewW, KViewH)];
    
    _centerImageView = [[UIImageView alloc]initWithFrame:CGRectMake(KViewW, 0, KViewW, KViewH)];
    _centerImageView.userInteractionEnabled = YES;
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                                   initWithTarget:self
                                   action:@selector(scrollViewClick:)];
    
    [_centerImageView addGestureRecognizer:tap];
    
    [self.mainScrollView addSubview:_leftImageView];
    [self.mainScrollView addSubview:_rightImageView];
    [self.mainScrollView addSubview:_centerImageView];

核心代码

根据scrollview的偏移量来计算当前位于的imageView。然后重置左右两个image的图片

	#pragma mark - 无限滚动核心
- (void)reloadImageViews {
    // 获取当前offset
    CGPoint scrollViewOffset = [_mainScrollView contentOffset];
    // 如果当前位于centerImageView
    if (scrollViewOffset.x == 2 * _mainScrollView.bounds.size.width) {
        if (_currentImageIndex == kImageCount - 1) {
            _currentImageIndex = 0;
        }else {
            
            _currentImageIndex = (_currentImageIndex +1) % kImageCount;
        }
        
    } else if (scrollViewOffset.x == 0) {
        if (_currentImageIndex == 0) {
            _currentImageIndex = kImageCount - 1;
        }else {
        
            _currentImageIndex = (_currentImageIndex -1) % kImageCount;
        }
        
    }
    
    _centerImageView.image =
    [UIImage imageNamed:_picDataArray[self.currentImageIndex]];
    
    // 重新设置左右图片
    _leftImageView.image =
    [UIImage imageNamed:_picDataArray[self.leftImageIndex]];
    
    _rightImageView.image =
    [UIImage imageNamed:_picDataArray[self.rightImageIndex]];
    
    _titleLabel.text = _titleDataArray[self.currentImageIndex];
    _pageControl.currentPage = self.currentImageIndex;
    
}

滚动过程中调整pageControl

	// MARK: - 滚动过程中
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    
    CGPoint scrollViewOffset = scrollView.contentOffset;
    
    if (scrollViewOffset.x > 1.5 * _mainScrollView.bounds.size.width) {
        
        _pageControl.currentPage = self.rightImageIndex;
        
        _titleLabel.text = _titleDataArray[self.rightImageIndex];
        
    } else if (scrollViewOffset.x < 0.5 * _mainScrollView.bounds.size.width) {
        
        _pageControl.currentPage = self.leftImageIndex;
        
        _titleLabel.text = _titleDataArray[self.leftImageIndex];
    }
    
    else {
        _pageControl.currentPage = self.currentImageIndex;
        
        _titleLabel.text = _titleDataArray[self.currentImageIndex];
    }
}

效果

09c30e48dbe4b8aaf176f1488f4751ce.gifios图片轮播效果

代码地址如下:
http://www.demodashi.com/demo/11959.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

posted on   demo例子集  阅读(1274)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示