封装scrollView 循环滚动

今天给大家送点干货:封装的简单实用及介绍,希望大家共同学习共同进步

封装在变成过程中非常重要,可以提高代码的复用性,可以高效的完成项目,并且可以对外部提供接口

大家可以看一下 封装之前 和封装之后

viewDidLoad 中的代码量 ,未封装之前 基本上所有的代码都写在了控制器内,十分的麻烦

封装之后 有少量的代码就可以完成特定的功能!

封装之前:

//
//  QHMainController.m

#import "QHMainController.h"
#import "GPAdsView.h"

@interface QHMainController ()<UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
@property(nonatomic,strong) NSTimer *timer;
@end

@interface QHMainController()<GPAdsViewDelegate>

@end
@implementation QHMainController

- (void)viewDidLoad {
    [super viewDidLoad];
    int totalPage = 5;
    CGFloat btnW = self.scrollView.frame.size.width;
    CGFloat btnH = self.scrollView.frame.size.height;

    for (int i = 0; i < totalPage; i++) {
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

        NSString *name = [NSString stringWithFormat:@"ad_%02d",i];
        UIImage *image = [UIImage imageNamed:name];

        [btn setBackgroundImage:image forState:UIControlStateNormal];
        CGFloat btnX = i*btnW;
        CGFloat btnY = 0;

        btn.frame = CGRectMake(btnX, btnY, btnW, btnH);

        [self.scrollView addSubview:btn];
    }

    _scrollView.contentSize = CGSizeMake(totalPage*btnW, btnH);
    _scrollView.pagingEnabled = YES;
    _scrollView.showsHorizontalScrollIndicator = NO;

    //设置代理有两种方式 设置
    _scrollView.delegate = self;
    //设置pageControl的属性
    self.pageControl.numberOfPages = totalPage;
    self.pageControl.currentPage = 0;

    [self startTimer];

#warning 新添加代码
    GPAdsView *adsView = [GPAdsView adsView];
    [self.view addSubview:adsView];

    adsView.images = @[@"ad_00",@"ad_01",@"ad_02",@"ad_03",@"ad_04"];

   // adsView.delegate = self;

    [adsView setAdsViewDidSelectedBlock:^(GPAdsView * adsView, NSString * image, NSInteger index) {
        [self adsViewDidSelected:adsView andImage:image andIndex:index];
    }];

}

-(BOOL)prefersStatusBarHidden
{
    return YES;
}

- (void)adsViewDidSelected:(GPAdsView *)adsView andImage:(NSString *)image andIndex:(NSInteger)index
{
    NSLog(@"图片名称 %@,索引值是 %ld",image,index);
}
//-(void)adsViewDidSelected:(GPAdsView *)adsView andImage:(NSString *)image andIndex:(NSInteger)index
//{
//    NSLog(@"图片名:%@,索引值:%ld",image,index);
//}

-(void)startTimer
{
     //添加一个定时器
    NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(autoScroll) userInfo:nil repeats:YES];
    self.timer = timer;
    [[NSRunLoop currentRunLoop]addTimer:self.timer forMode:NSRunLoopCommonModes];

}

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.timer invalidate];
}

-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
    [self startTimer];
}
-(void)autoScroll
{
    //1.得到偏移量
    //2如何得大滚动的位置
    int totalPage = 5;
    int page = self.pageControl.currentPage >=totalPage -1?0:self.pageControl.currentPage+1;
    self.scrollView.contentOffset = CGPointMake(page*self.scrollView.frame.size.width, 0);

}

//只要发生滚动就会自动调用
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGPoint contentOffSet = self.scrollView.contentOffset;

    int page = (contentOffSet.x + self.scrollView.frame.size.width*0.5)/self.scrollView.frame.size.width;

    self.pageControl.currentPage = page;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end

封装之后:

- (void)viewDidLoad {
    [super viewDidLoad];

#warning 新增代码
    GPAdsView * adsView = [GPAdsView adsView];

    [self.view addSubview:adsView];

    adsView.images = @[@"ad_00",@"ad_01",@"ad_02",@"ad_03",@"ad_04"];
//    adsView.delegate = self;
    [adsView setAdsViewDidSelectedBlock:^(GPAdsView * adsView, NSString * image, NSInteger index) {

        [self adsViewDidSelected:adsView andImage:image andIndex:index];

    }];

}

下面是封装的view 大家可以参考学习一下,有哪里不合适的大家可以多提建议

代码的注释写了不少 应该基本可以理解

//
//  GPAdsView.h

#import <UIKit/UIKit.h>
#import "UIView+UIViewFrame.h"
/**
 *  设置代理
 */
@class GPAdsView;

@protocol GPAdsViewDelegate <NSObject>

//-(void)adsViewDidSelected:(GPAdsView *)adsView andImage:(NSString *)image andIndex:(NSInteger)index;

- (void)adsViewDidSelected:(GPAdsView *)adsView andImage:(NSString *)image andIndex:(NSInteger)index;

@end

@interface GPAdsView : UIView

+(id)adsView;
@property(nonatomic,copy)void(^adsViewDidSelectedBlock)(GPAdsView * adssView,NSString *image,NSInteger index);
@property(nonatomic,assign)id<GPAdsViewDelegate>delegate;
@property(nonatomic,strong)NSArray *images;//如果想要保存值的话必须用强指针!!!!
@end
//
//  GPAdsView.m
//  练习代码-8-14

#import "GPAdsView.h"
//匿名扩展
@interface GPAdsView()<UIScrollViewDelegate>

@property(nonatomic,weak)UIScrollView *scrollView;
@property(nonatomic,weak)UIPageControl *pageControl;
@property(nonatomic,strong)NSTimer *timer;

@end

@implementation GPAdsView

+(id)adsView
{
    return [[self alloc]init];
}

-(id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        NSLog(@"调用initWithFrame");
    //1.初始化scrollView
        UIScrollView *scrollView = [[UIScrollView alloc]init];
        scrollView.delegate = self;
        scrollView.pagingEnabled =YES;
        //scrollView.showsHorizontalScrollIndicator = NO;
        [self addSubview:scrollView];
        self.scrollView = scrollView;
    //2.初始化PageView
        UIPageControl *pageControl = [[UIPageControl alloc]init];
        pageControl.pageIndicatorTintColor = [UIColor greenColor];
        pageControl.currentPageIndicatorTintColor = [UIColor redColor];
        [self addSubview:pageControl];
        self.pageControl = pageControl;
        pageControl.currentPage = 0;
    }

    [self startTimer];
    return self;
}
-(void)setImages:(NSArray *)images
{
    _images = images;
    NSLog(@"%@",_images);
    //设置依赖数据的一些属性
    //设置页码数
    self.pageControl.numberOfPages = images.count;
    //设置scrollView 的contentSize 大小
    self.scrollView.contentSize = CGSizeMake(self.frame.size.width*images.count, 0);

    for (int i = 0; i < images.count; i++) {
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

        CGFloat btnW = self.scrollView.width;
        CGFloat btnH = self.scrollView.frame.size.height;
        CGFloat btnX = btnW *i ;
        CGFloat btnY = 0;

        btn.frame = CGRectMake(btnX, btnY, btnW, btnH);

        NSString *name = images[i];
        UIImage *image = [UIImage imageNamed:name];
        [btn setBackgroundImage:image forState:UIControlStateNormal];

        btn.tag = i;

        [self.scrollView addSubview:btn];
        [btn addTarget:self action:@selector(btnTouch:) forControlEvents:UIControlEventTouchUpInside];
    }

}

-(void)btnTouch:(UIButton *)btn
{
    NSLog(@"点击事件发生");
//    [_delegate adsViewDidSelected:self andImage:self.images[btn.tag] andIndex:btn.tag];
       [_delegate adsViewDidSelected:self andImage:self.images[btn.tag] andIndex:btn.tag];
    NSLog(@"%@",self.images[btn.tag]);
    NSLog(@"-------------");

    if (self.adsViewDidSelectedBlock) {
        self.adsViewDidSelectedBlock(self,self.images[btn.tag],btn.tag);
    }
}

-(void)willMoveToSuperview:(UIView *)newSuperview
{
    //一般抽象出来的都是一个单独的UIView 如果有特殊的需求那么我们会继承 其他的类

    //设置View的frame
    CGFloat selfX = 0;
    CGFloat selfY = 0;
    CGFloat selfW = newSuperview.frame.size.width;
    CGFloat selfH = 220;

    self.frame = CGRectMake(selfX, selfY, selfW, selfH);
    self.backgroundColor = [UIColor yellowColor];

    //设置scrollview 的frame
    //self.scrollView.frame = CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height);
    self.scrollView.frame = self.bounds;
    self.scrollView.backgroundColor = [UIColor yellowColor];
    //设置pageControl 的frame
    self.pageControl.frame = CGRectMake(0,self.frame.size.height-40, self.frame.size.width, 0);

}

#pragma 实现基本功能  点击拖动图片,pageContrl 的值发生改变

/**
 *  这里注意不要选错函数,函数的功能和作用都不一样
 *
 *  @param scrollView <#scrollView description#>
 */
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    //获得偏移量
    int page = (self.scrollView.contentOffset.x + self.frame.size.width*0.5)/self.frame.size.width;

    self.pageControl.currentPage = page;

    //NSLog(@"%d",page);
}

#pragma 实现自动滚动的功能 

/**
 *  定时器 这里的定时器选需要注意
 */
-(void)startTimer
{
    // 每隔1秒中就会调用函数autoScroll 我们不用考虑他是怎样实现的
    //要慢慢养成面向对象的变成思想
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(autoScroll) userInfo:nil repeats:YES];

    //这里设置事件很重要 防止用户交互时产生冲突
    [[NSRunLoop currentRunLoop]addTimer:self.timer forMode:NSRunLoopCommonModes];

}

-(void)autoScroll
{
     //怎样使屏幕自动滚动??每当我们遇到问题时候都要思考
    int totalPage = 5;
    int page = self.pageControl.currentPage >= totalPage -1?0:self.pageControl.currentPage + 1;
    self.scrollView.contentOffset = CGPointMake(self.scrollView.frame.size.width*page, 0);
}
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{

    [self.timer invalidate];//如果关闭之后无法开启

}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    [self startTimer];
}

@end

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 05:28:32

封装scrollView 循环滚动的相关文章

封装scrollView 循环滚动,tableViewCell(连载) mvc

封装 封装 封装 ... 封装的重要性太重要了 给大家在送点干货 从一个项目中抽取出来的,和大家一起分享 封装scrollView 循环滚动,tableViewCell(连载) 明天还会更新 tableView 的封装 使用了mvc 设计模式 代码如下: // // GPMainController.m #import "GPMainController.h" #import "GPAdsView.h" #import "GPSubViewCell.h&q

ScrollView循环滚动图片

涉及到banner页或者相册浏览,考虑到性能问题和用户体验性,经常要用到ScrollView循环滚动图片,在此只分析banner页,相册浏览类似: 设计思想: UIScrollView添加三个ImageView:firstImgView,secondImgView,thirdImgView. 当前每次显示的都是secondImgView,firstImgView显示前一张图片,thirdImgView显示后一张图片,若secondImgView显示的是第一张图片,则firstImgView显示最

IOS实现自动循环滚动广告--ScrollView的优化和封装

一.问题分析 在许多App中,我们都会见到循环滚动的视图,比如广告,其实想实现这个功能并不难,用ScrollView就可以轻松完成,但是在制作的过程中还存在几个小问题,如果能够正确的处理好这些小问题,无论从效果还是性能上都会得到优化. 问题一 第一个问题是如何用ScrollView来展示N个视图.想要实现这个效果,可以把N个视图依次按顺序添加到ScrollView上,然后把 ScrollView的contentSize设置为N个视图的尺寸,通过滑动ScrollView来查看加在上面的视图. 问题

循环滚动图 - iOS

自己在工作之余封装了一个简单的scrollview轮播(自动循环滚动由右向左,手动情况下左右均可循环滚动),感觉自己就算是一个iOS初级开发者,所以如果代码有瑕疵或者不好的地方,希望各位大神及时的指出来,代码洁癖的人发现bug看了不爽可以直接@批评我. 多话不说了先献上代码--https://github.com/jasonlee94/AdvertisingView 这个整体思路就是:收取到图片之后,第一张的前面放置最后一张图,最后一张图片的后面放置第一张图,也就是说如果收到四张图片,那么scr

循环滚动scrollView---最后一张图片后面紧跟着第一张图片,第一张图片前面挨着最后一张图片

问题描述:循环滚动scrollView---最后一张图片后面紧跟着第一张图片,第一张图片前面挨着最后一张图片,形成环,循环切换图片. 效果图如下: 具体代码如下: //  ViewController.m #import "ViewController.h" #define kW 375 #define kH 500 #define kCount 11 @interface ViewController () <UIScrollViewDelegate> @end @imp

android图片全景360&#176;自动(手动)循环滚动

一个自定义控件: 地址 github:https://github.com/guoGavin/PanoramicAutoScroll csdn:http://download.csdn.net/detail/jiguangcanhen/8404891 效果图 功能 按照一定的速度自动滚动. 当手指进行操作则停止滚动,手指放开则继续滚动. 可以设置为无限循环滚动或者无限往复滚动. 可以设置滚动速度. Layout <com.gavin.panoramicautoscroll.AutoScrollH

ios监听ScrollView/TableView滚动的正确姿势

主要介绍 监测tableView垂直滚动的舒畅姿势 监测scrollView/collectionView横向滚动的正确姿势 1.监测tableView垂直滚动的舒畅姿势 通常我们用KVO或者在scrollViewDidScroll代理方法中监听ScrollView/TableView的contentOffset,比如监听TableView的contentOffset来设置导航栏的透明度或者拉伸顶部的图片. image image 常见的姿势是在scrollViewDidScroll的代理方法中

iOS 幻灯片的自动循环滚动

首先,我说一下思路,自动滚动的实现是通过定时器进行实现的.当然,考虑到我们在定时循环的时候可能有进行手动滑动,所以我们就要根据 pageControl的当前定点进行判断. 而循环滚动是通过对幻灯片中image多加2进行实现的. 假如你幻灯片中有5个元素需要循环: [0, 1, 2, 3, 4] 那么你在将这四个元素添加到UIScrollView里面的时候,就需要多添加两个,变成这样: [ 4, 0, 1, 2, 3, 4, 0 ] 然后只需要在scrollViewDidEndDecelerati

使用UIScrollView 结合 UIImageView 实现图片循环滚动

场景: 在开发工作中,有时我们需要实现一组图片循环滚动的情况.当我们使用 UIScrollView 结合 UIImageView 来实现时,一般 UIImageView 会尽量考虑重用,下面例子是以(左中右)三个 UIImageView 的使用,其实也可以考虑使用 两个 UIImageView 实现的情况.这样避免 一组图片多少个就对应多少个 UIImageView 所导致占用过多内存的情况. 效果如下: ViewController.h 1 #import <UIKit/UIKit.h> 2