自定义一个简单的ScrollView

一步一步交你做一个自动滚动的ScrollView

UIScrollView 是一个滚动的试图 根据这里我们大概可以确定它拥有哪些熟悉

简单的UIScrollView实现方法一步一步走

1、ScrollView也是一个可以滚懂的视图类似于TableView所以它肯定存在一个第几个视图的属性

@property (nonatomic, assign) NSInteger currentPage;
2、类似于TableView我们得知道它上面有多少个视图所以定义一个方法返回视图个数

- (NSInteger)numberOfPageInScrollView:(MyScrollView *)scrollView;

3、我们需要给它添加点击事件记录我们点击的是第几个视图所以需要一个方法返回值为Nsinteger

- (UIView *)scrollView:(MyScrollView *)scrollView viewAtIndex:(NSInteger)index;
4、既然有数据处理就是控制视图个数等类似tableView定义一个继承自MyScrollViewDataSource的协议

- (NSInteger)numberOfPageInScrollView:(MyScrollView *)scrollView;
5这样的SCrollView上面是不是没有东西呢 所以我们需要再定义一个方法给它添加数据的

-(void)reloadData;

二、接下来就是创建UIScrollView了

1、第一步当然是初始化也就是alloc init;

由于在后面也需要用到 所以我们写在外面及

@interface MyScrollView ()
{
    UIScrollView *_scrollView;
}
@end
@synthesize currentPage = _currentPage;
2、然后就是初始化了

 - (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        _scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
        _scrollView.pagingEnabled = YES;
        _scrollView.showsHorizontalScrollIndicator = NO;
        [self addSubview:_scrollView];
    }
    return self;
}
3、当我们点进UIScrollView的时候我们可以看到它有很多的属性详情看下表

属性作用
CGPoint contentOffSet监控目前滚动的位置
CGSize contentSize滚动范围的大小
UIEdgeInsets contentInset视图在scrollView中的位置
id<UIScrollerViewDelegate>
delegate
设置协议
BOOL directionalLockEnabled指定控件是否只能在一个方向上滚动
BOOL bounces控制控件遇到边框是否反弹
BOOL alwaysBounceVertical控制垂直方向遇到边框是否反弹
BOOL alwaysBounceHorizontal控制水平方向遇到边框是否反弹
BOOL pagingEnabled控制控件是否整页翻动
BOOL scrollEnabled控制控件是否能滚动
BOOL showsHorizontalScrollIndicator控制是否显示水平方向的滚动条
BOOL
showsVerticalScrollIndicator
控制是否显示垂直方向的滚动条
UIEdgeInsets scrollIndicatorInsets指定滚动条在scrollerView中的位置
UIScrollViewIndicatorStyle
indicatorStyle
设定滚动条的样式
float decelerationRate改变scrollerView的减速点位置
BOOL tracking监控当前目标是否正在被跟踪
BOOL dragging监控当前目标是否正在被拖拽
BOOL decelerating监控当前目标是否正在减速
BOOL delaysContentTouches控制视图是否延时调用开始滚动的方法
BOOL canCancelContentTouches控制控件是否接触取消touch的事件
float minimumZoomScale缩小的最小比例
float maximumZoomScale放大的最大比例
float zoomScale设置变化比例
BOOL bouncesZoom控制缩放的时候是否会反弹
BOOL zooming判断控件的大小是否正在改变
BOOL zoomBouncing判断是否正在进行缩放反弹
BOOL scrollsToTop控制控件滚动到顶部
这里不一一实验了

我们选择

_scrollView.pagingEnabled = YES;

_scrollView.showsHorizontalScrollIndicator = NO;
这样控件就能整页翻动并且不现实水平方向的滚动条

然后将它显示在View上面

[self addSubview:_scrollView];

4、接下来就是通过reloadData方法在ScrollView上面添加数据

- (void)reloadData
{
    [_scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    //让数组里面的数据都调用removeFromSuperview这个方法清除之前的视图
    NSInteger count = [_dataSource numberOfPageInScrollView:self];
    //获取ScrollView的最大个数
    CGFloat width = self.frame.size.width;
    CGFloat height = self.frame.size.height;
   //设置ScrollView的宽度及显示视图宽度乘上视图的最大个数
    _scrollView.contentSize = CGSizeMake(width * count, height);
   //通过for循环将每个view创建出来并且确定位置
    for (NSInteger i = 0; i < count; i++) {
        UIView *view = [_dataSource scrollView:self viewAtIndex:i];
        view.frame = CGRectMake(i * width, 0, width, height);
     //将View加载到ScrollView上面显示出来 
      [_scrollView addSubview:view];
    }
}
 返回页面的个数

- (NSInteger)currentPage
{
    return _scrollView.contentOffset.x / _scrollView.frame.size.width;
}
Contentoffset是scrollview当前显示区域顶点相对于frame顶点的偏移量

5、接下来在ViewController.m里面

- (void)setCurrentPage:(NSInteger)currentPage
{
    _scrollView.contentOffset = CGPointMa<pre name="code" class="objc"> MyScrollView *myScrollView = [[MyScrollView alloc] initWithFrame:CGRectMake(0, 70, 320, 140)];
    myScrollView.dataSource = self;
    [self.view addSubview:myScrollView];
    
    [myScrollView reloadData];
    myScrollView.currentPage = 1;

ke(_scrollView.frame.size.width * currentPage, 0); _currentPage = currentPage;}
确定有10个页面
-(NSInteger)numberOfPageInScrollView:(MyScrollView *)scrollView

 

{
    return 10;
}
6、每个视图显示的类容
-(UIView *)scrollView:(MyScrollView *)scrollView viewAtIndex:(NSInteger)index
{
    double value = arc4random() %256;
    UIView *v = [[UIView alloc] init];
    v.backgroundColor = [UIColor colorWithRed:index * 0.1 green:index *0.3 blue:value / 256  alpha:1];
    

    return v;
}

上面就实现了一个简单的ScrollView

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值