简单的重用 ios(效果类似图片无限循环(可支持多种图片))

本文介绍了如何在iOS中实现一个简单的图片无限循环滚动的效果,通过具体的代码展示重用机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天学会了一个简单的重用案例:

具体代码如下:

@interface ReuseView : UIView <UIScrollViewDelegate>
{
    UIScrollView* _scrollView;
}
@property(nonatomic,retain)NSMutableArray* imageArr;
@property(nonatomic,retain)NSMutableArray* currentArr;
@end

@interface ReuseView ()
/**
 *  输入图片数量来加载到图片数组内(只存图片名)
 *
 *  @param num num description
 *
 *  @return return value description
 */
-(NSMutableArray*)imageNamesNum:(int)num;
/**
 *  根据下一张显示的图片来更新缓存的array
 *
 *  @param locationAtImageArr locationAtImageArr
 */
-(void)repaceImageName:(int)locationAtImageArr;
/**
 *  替换显示视图,(全部更新)
 *
 *  @param scrollView scrollView description
 */
-(void)replaceView:(UIScrollView*)scrollView;
@end
@implementation ReuseView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        _scrollView = [[UIScrollView alloc]initWithFrame:frame];
        _scrollView.contentSize=CGSizeMake(frame.size.width*3, frame.size.height);
        _scrollView.backgroundColor =[UIColor orangeColor];
        _scrollView.directionalLockEnabled = YES;
        _scrollView.pagingEnabled = YES;
        _scrollView.showsVerticalScrollIndicator = NO;
        self.imageArr    = [NSMutableArray arrayWithArray:[self imageNamesNum:6]];//图片数量设为默认了,可以修改
        self.currentArr  = [NSMutableArray arrayWithCapacity:3];
        for (int i = 0  ;i< 3;i++) {
            [self.currentArr addObject:[self.imageArr objectAtIndex:i]];
        }
        [self addSubViews];
        _scrollView.delegate = self;
        [self addSubview:_scrollView];
    }
    return self;
}
-(void)addSubViews{
    for (int i = 0  ;i< 3;i++) {
        UIImage* image = [[UIImage alloc]initWithContentsOfFile:[self.imageArr objectAtIndex:i]];
        UIImageView* imageView = [[UIImageView alloc]initWithImage:image];
        imageView.frame = CGRectMake(self.frame.size.width*i, 0, self.frame.size.width, self.frame.size.height);
        imageView.tag = 100+i;
        [_scrollView addSubview:imageView];
        _scrollView.contentOffset = CGPointMake(self.frame.size.width, 0);
        [image release];
        [imageView release];
    }
}
-(NSMutableArray*)imageNamesNum:(int)num{
    NSMutableArray* arr = [NSMutableArray arrayWithCapacity:num];
    for (int i=0; i<num; i++) {
        NSString* filePath =[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%d",i+1] ofType:@"jpg"];
        [arr addObject:filePath];
    }
    return arr  ;
}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    CGPoint offset = scrollView.contentOffset;
    int moveImage = (offset.x - self.frame.size.width)/ self.frame.size.width;
    scrollView.contentOffset = CGPointMake(self.frame.size.width, 0);//不论如何移动定位到中间的视图
    if (moveImage) {
        int  locationAtImageArr = [self.imageArr indexOfObject:[self.currentArr objectAtIndex:moveImage+1]];//计算将要显示的图片的位置
        [self repaceImageName:locationAtImageArr];
        [self replaceView:scrollView];
    }
}
-(void)replaceView:(UIScrollView*)scrollView{
    /**
     *  根据缓存数组内容来刷新视图
     */
    for (int i =0 ; i<3; i++) {
        UIImageView* currentImageView =(UIImageView*)[scrollView viewWithTag:(100+i)];
        UIImage* currentImage =  [UIImage imageWithContentsOfFile:[self.currentArr objectAtIndex:i]];
        currentImageView.image =currentImage;
    }
}
-(void)repaceImageName:(int)locationAtImageArr{
    //给缓存的数组第一个元素赋值
    [self.currentArr replaceObjectAtIndex:0 withObject:[self.imageArr objectAtIndex:((locationAtImageArr-1)<0?([self.imageArr count]-1):locationAtImageArr-1)]];
    //给缓存的数组第二个元素赋值
    [self.currentArr replaceObjectAtIndex:1 withObject:[self.imageArr objectAtIndex:locationAtImageArr]];
    //给缓存的数组第三个元素赋值
    [self.currentArr replaceObjectAtIndex:2 withObject:[self.imageArr objectAtIndex:(locationAtImageArr+1>([self.imageArr count]-1)?0:locationAtImageArr+1)]];
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值