block代替协议自定义UIScrollView实现分页效果


#import <UIKit/UIKit.h>

@interface CustomScrollView : UIView
//页数
@property (nonatomic, strong) NSInteger (^numberOfPageInScrollView)(CustomScrollView*scrollView);
//返回一个View,这里显示图片,当前页面
@property (nonatomic, strong) UIView *(^scroll)(CustomScrollView *scrollView,NSInteger page);
//点击取得当前页面
@property (nonatomic, strong) void (^didSelectAtPage)(CustomScrollView *scrollView,NSInteger page);
//当前页
@property (nonatomic, assign) NSInteger currentPage;
//加载页数,图片等数据
- (void)reloadData;

@end




#import "CustomScrollView.h"

@interface CustomScrollView () <UIScrollViewDelegate>
{
    UIScrollView *_scrollView;
    NSInteger _currentPage;
}
@end

@implementation CustomScrollView

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        
        _scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
        _scrollView.pagingEnabled = YES;//设置能翻页
        _scrollView.delegate = self;
        _scrollView.showsHorizontalScrollIndicator = NO;//锁定只能水平滑动
        [self addSubview:_scrollView];
        //增加一个点击手势,用来获得点击view得到响应
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTap:)];
        [self addGestureRecognizer:tap];
    }
    return self;
}
//加载数据
- (void)reloadData
{
    //得到页数
    NSInteger count = _numberOfPageInScrollView(self);
    CGFloat width = self.frame.size.width;//宽度
    CGFloat height = self.frame.size.height;//高度
    _scrollView.contentSize = CGSizeMake(width * count, height);//设置内容宽度和高度
    //生成对应页数的view
    for (NSInteger i = 0; i < count; i++) {
        UIView *view = _scroll(self,i);
        view.frame = CGRectMake(i * width, 0, width, height);
    
        [_scrollView addSubview:view];
    }
}

- (void)didTap:(NSInteger)page
{
    NSInteger index = _scrollView.contentOffset.x / _scrollView.frame.size.width;
    _didSelectAtPage(self,index);
    //提示窗口
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"当前页"
                                                    message:[NSString stringWithFormat:@"%d",index]
                                                    delegate:self
                                          cancelButtonTitle:@"cance"
                                          otherButtonTitles: nil];
    [alert show];
}

- (NSInteger)currentPage
{
    
    return  _scrollView.contentOffset.x / _scrollView.frame.size.width;
}

- (void)setCurrentPage:(NSInteger)currentPage
{
    _scrollView.contentOffset = CGPointMake(_scrollView.frame.size.width * currentPage, 0);
    _currentPage = currentPage;
    
}
//滑动后松开手指速度为0时执行
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    NSInteger index = _scrollView.contentOffset.x / _scrollView.frame.size.width;
    //点击的是那一页
    _didSelectAtPage(self,index);
}




@end


#import "ViewController.h"
#import "CustomScrollView.h"
#import "UIImageView+WebCache.h"

@interface ViewController ()

@end

@implementation ViewController
            
- (void)viewDidLoad {
    [super viewDidLoad];
    CustomScrollView *scrollView = [[CustomScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 180)];
    scrollView.currentPage = 9;
    [self.view addSubview:scrollView];
    //设置滚动页面
    scrollView.numberOfPageInScrollView = ^(CustomScrollView *add){
        return 10;
    };

    scrollView.scroll = ^(CustomScrollView *as,NSInteger page){
        UIImageView *imageView = [[UIImageView alloc] init];
        imageView.image = [UIImage imageNamed:@"1.jpg"];
        UILabel*label1 = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, 100, 30)];
        label1.text = [NSString stringWithFormat:@"Page :%d",page];

        if (page%2) {
            label1.backgroundColor = [UIColor magentaColor];
        }
        //在block里不能用scrollView来调用
        //变量名字不好取
        as.didSelectAtPage = ^(CustomScrollView *as,NSInteger inte)
        {
            NSLog(@"%d",page);
        };

        [imageView addSubview:label1];
        return imageView;
    };
//怎么自动调用是个问题
    [scrollView reloadData];

}

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

@end


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值