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

UIScrollView------2常见代理使用

2015-10-14 01:03 621 查看
1.常见代理方法

UIScrollView常见代理方法,放大缩小实例讲解实现。

#import "ViewController.h"

@interface ViewController ()<UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIImageView *image;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
_scrollView.delegate = self;
_scrollView.contentSize = CGSizeMake(1440, 900);
//设置放缩的比例
_scrollView.minimumZoomScale = 0.5;
_scrollView.maximumZoomScale = 2;
}

#pragma mark UIScrollViewDelegate

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
NSLog(@"用户开始拖拽时调用");
}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
NSLog(@"具体滚动到某个位置时调用");
NSLog(@"%@",NSStringFromCGPoint(_scrollView.contentOffset));
}

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
NSLog(@"停止拖拽时调用");
}

-(void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view{
NSLog(@"开始拖动");
}

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
return _image;
}

-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale{
NSLog(@"正在拖动");
}

@end


2综合运用,广告Banner

(1)首先加一个UIScrollView,设置320*200,再拖入一个UIPageControl在UIScrollView的上方,并设置当前颜色,和点的个数



代码,1.设置banner的contentSize确定滚动范围 2.将3张图片依次添加到banner中,只需处理x的坐标 3.banner的分页属性设置为YES

#import "ViewController.h"

@interface ViewController ()
//滚动栏
@property (weak, nonatomic) IBOutlet UIScrollView *banner;
//分页
@property (weak, nonatomic) IBOutlet UIPageControl *pageContrl;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
//设置滚动范围
_banner.contentSize = CGSizeMake(320*3, 200);
//分页
_banner.pagingEnabled = YES;
//隐藏底部指示器
_banner.showsHorizontalScrollIndicator = NO;
//初始化图片 并添加到banner中
for(int i=0;i<3;i++){
UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"image_%d.jpg",i+1]]];
imageView.frame = CGRectMake(i*320, 0, 320, 200);
[_banner addSubview:imageView];
}
}


效果



此时UIPageControl的点并不会随着图片的拖动变化而变化,要使U点跟着变化

1.实现UIScrollView的-(void)scrollViewDidScroll:(UIScrollView *)scrollView方法

2.在步骤1方法中通过banner的contentOffset获取移动的坐标,知道移动到了那里

3.通过(contentoffset.x + scrollView/2)/scrollView宽度算出页面

#import "ViewController.h"

@interface ViewController ()<UIScrollViewDelegate>
//滚动栏
@property (weak, nonatomic) IBOutlet UIScrollView *banner;
//分页
@property (weak, nonatomic) IBOutlet UIPageControl *pageContrl;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
//设置滚动范围
_banner.contentSize = CGSizeMake(320*3, 200);
//分页
_banner.pagingEnabled = YES;
//隐藏底部指示器
_banner.showsHorizontalScrollIndicator = NO;
//初始化图片 并添加到banner中
for(int i=0;i<3;i++){
UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"image_%d.jpg",i+1]]];
imageView.frame = CGRectMake(i*320, 0, 320, 200);
[_banner addSubview:imageView];
}
//设置代理
_banner.delegate = self;
}
#pragma makr UIScrollViewDelegate
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
NSLog(@"正在滚动");
//计算页面
//页码(contentoffset.x + scrollView宽度/2)/scrollView宽度,这里利用UIScrollView分页机制
CGFloat bannerW = _banner.frame.size.width;
CGFloat x = _banner.contentOffset.x;
//页码
int page = (x + bannerW/2)/bannerW;
_pageContrl.currentPage = page;
}

@end


很多时候需要我们进行自动滚动,可以通过NSTimer来实现,代码连接https://github.com/gurongkang/TestBanner

#import "ViewController.h"

@interface ViewController ()<UIScrollViewDelegate>
//滚动栏
@property (weak, nonatomic) IBOutlet UIScrollView *banner;
//分页
@property (weak, nonatomic) IBOutlet UIPageControl *pageContrl;
@end

@implementation ViewController{
NSTimer *_timer;
}

/**
*  @author 顾荣康, 15-10-16 15:10:47
*
*  @brief
*/
- (void)viewDidLoad {
[super viewDidLoad];
//设置滚动范围
_banner.contentSize = CGSizeMake(320*3, 200);
//分页
_banner.pagingEnabled = YES;
//隐藏底部指示器
_banner.showsHorizontalScrollIndicator = NO;
//初始化图片 并添加到banner中
for(int i=0;i<3;i++){
UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"image_%d.jpg",i+1]]];
imageView.frame = CGRectMake(i*320, 0, 320, 200);
[_banner addSubview:imageView];
}
//设置代理
_banner.delegate = self;
//添加定时器
[self addTimer];
}
#pragma makr UIScrollViewDelegate

/**
*  @author 顾荣康, 15-10-16 15:10:11
*
*  @brief  将要开始滚动
*
*  @param scrollView
*/
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
[self removeTimer];
}

/**
*  @author 顾荣康, 15-10-16 15:10:55
*
*  @brief  正在滚动
*
*  @param scrollView <#scrollView description#>
*/
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
NSLog(@"正在滚动");
//计算页面
//页码(contentoffset.x + scrollView宽度/2)/scrollView宽度,这里利用UIScrollView分页机制
CGFloat bannerW = _banner.frame.size.width;
CGFloat x = _banner.contentOffset.x;
//页码
int page = (x + bannerW/2)/bannerW;
_pageContrl.currentPage = page;

}

/**
*  @author 顾荣康, 15-10-16 15:10:25
*
*  @brief  拖拽停止时
*
*  @param scrollView
*  @param decelerate
*/
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
[self addTimer];
}

/**
*  @author 顾荣康, 15-10-16 15:10:08
*
*  @brief  下一个图片
*/
-(void)nextImage{
NSInteger page = self.pageContrl.currentPage;
if(page==2){
page = 0;
}else{
page++;
}
_banner.contentOffset = CGPointMake(page*320, 0);

}

/**
*  @author 顾荣康, 15-10-16 14:10:51
*
*  @brief  添加定时器
*/
-(void)addTimer{
NSLog(@"添加定时器");
_timer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
}

/**
*  @author 顾荣康, 15-10-16 14:10:02
*
*  @brief  去除定时器
*/
-(void)removeTimer{
NSLog(@"去除定时器");
if(_timer!=nil){
[_timer invalidate];
}
}

@end


swift纯代码实现https://github.com/gurongkang/TestBanner-swift

import UIKit

class ViewController: UIViewController,UIScrollViewDelegate {

//初始化banner
private var banner:UIScrollView = UIScrollView()
//UIPageControl
private var pageControl = UIPageControl(frame: CGRectMake(20, 180, 100, 20))
private var timer:NSTimer!
//MARK: 生命周期
override func loadView() {
super.loadView()
//设置看见的范围
banner.frame = CGRectMake(0, 0, 320, 200)
//设置滚动范围
banner.contentSize = CGSizeMake(320*3, 200)
//分页
banner.pagingEnabled = true;
//隐藏底部指示器
banner.showsHorizontalScrollIndicator = false;
//添加到view
self.view.addSubview(banner)
//初始化图片
for(var i=0;i<3;i++){
let imageView = UIImageView(image: UIImage(named: "image_\(i+1).jpg"))
imageView.frame = CGRectMake(CGFloat(i)*320, 0, 320, 200)
banner.addSubview(imageView)
}
pageControl.currentPage = 0
pageControl.numberOfPages = 3
self.view.addSubview(pageControl)
banner.delegate = self;
self.addTimer()
}

override func viewDidLoad() {
super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}

//MARK:UIScrollViewDelegate
/**
开始拖动

- parameter scrollView:
*/
func scrollViewWillBeginDragging(scrollView: UIScrollView) {
self.removeTimer()
}

func scrollViewDidScroll(scrollView: UIScrollView) {
let bannerW = banner.frame.size.width
let x = banner.contentOffset.x
let page = (x + bannerW/2)/bannerW
pageControl.currentPage = Int(page);
}

func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
self.addTimer()
}

//MARK:定时器
/**
添加定时器
*/
func addTimer(){
print("添加定时器")
timer = NSTimer(timeInterval: 1.0, target: self, selector: "nextImage", userInfo: nil, repeats: true)
NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
}

/**
去除定时器
*/
func removeTimer(){
print("去除定时器")
timer.invalidate()
}
//MARK: 业务方法
/**
下一张图片
*/
func nextImage(){
var page = self.pageControl.currentPage
if(page==2){
page = 0
}else{
page++
}
banner.contentOffset = CGPointMake(CGFloat(page)*320, 0)
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: