您的位置:首页 > 产品设计 > UI/UE

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

2014-08-20 21:35 459 查看
#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息