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

IOS 基础开发之 UIScrollView的使用

2013-03-26 16:18 483 查看
UIScrollView 是我们在项目开发过程中,经常会用到的控件。

1、初始化

//init 
    UIScrollView *scrollView = [[UIScrollView alloc] init];
    [scrollView setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    [self.view addSubview:scrollView];
    [scrollView release];


这里还可以更加需要设置delegate设置为self。

2、常用属性

scrollView.pagingEnabled = YES;
    scrollView.showsHorizontalScrollIndicator = YES;
    scrollView.showsVerticalScrollIndicator = YES; 
    scrollView.zoomScale = 2.0f; 
    scrollView.pagingEnabled = YES;
    scrollView.contentOffset = CGPointMake(0, 0); 
    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width, scrollView.frame.size.height);


。。。。

3、结合 UIPageControl 做页面滚动效果

首先应该设置如下:

scrollView.pagingEnabled = YES;
    scrollView.delegate = self;


在.h文件中

@interface scrollViewViewController : UIViewController<UIScrollViewDelegate>
{
    NSTimer     *myTimer;
}
@property (retain, nonatomic)  UIPageControl *myPageControl;
@property (retain, nonatomic)  UIScrollView *adsScrollView;

@end


在.m文件中

#import "scrollViewViewController.h"

@interface scrollViewViewController ()

@end

@implementation scrollViewViewController
@synthesize myPageControl,adsScrollView;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
myTimer=[NSTimer scheduledTimerWithTimeInterval:2.0f target:self selector:@selector(scrollToNextPage:) userInfo:nil repeats:YES];

// Do any additional setup after loading the view from its nib.
}

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

-(void)initMyScrollView
{
//init UIScrollView *scrollView = [[UIScrollView alloc] init]; [scrollView setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; [self.view addSubview:scrollView]; [scrollView release];
//add label
UILabel *showTxt = [[UILabel alloc] init];
[showTxt setFrame:CGRectMake(20, 20, scrollView.frame.size.width - 40, scrollView.frame.size.height - 40)];
showTxt.backgroundColor = [UIColor clearColor];
showTxt.text = @"add label";
[scrollView addSubview:showTxt];
[showTxt release];

scrollView.pagingEnabled = YES; scrollView.delegate = self;

myPageControl = [[UIPageControl alloc] init];
[myPageControl setFrame:CGRectMake(0, 200, self.view.frame.size.width, self.view.frame.size.height)];
[myPageControl addTarget:self action:@selector(pageValueChanged:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:myPageControl];
}
-(void)scrollToNextPage:(id)sender
{
int pageNum = myPageControl.currentPage;
if (pageNum == 4) {
pageNum = -1;
}
[adsScrollView setContentOffset:CGPointMake(adsScrollView.frame.size.width * (pageNum + 1), 0) animated:YES];
}
- (void)pageValueChanged:(id)sender {
[adsScrollView setContentOffset:CGPointMake(adsScrollView.frame.size.width * myPageControl.currentPage, 0) animated:YES];
}
#pragma mark - UIScrollViewDelegate
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{

CGFloat pageWidth=self.myPageControl.frame.size.width;
int currentPage = floor((scrollView.contentOffset.x-pageWidth/2)/pageWidth)+1;
self.myPageControl.currentPage = currentPage;
}
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
myTimer=[NSTimer scheduledTimerWithTimeInterval:2.0f target:self selector:@selector(scrollToNextPage:) userInfo:nil repeats:YES];

}
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
[myTimer invalidate];
}

-(void)dealloc{
[super dealloc];
[myPageControl release];
[adsScrollView release];
}
@end


4、图片的缩放

首先,预定义:

#define ZOOM_VIEW_TAG 200
#define ZOOM_STEP 2.0


初始化如下:

[scenicImgView setTag:ZOOM_VIEW_TAG];
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
    UITapGestureRecognizer *twoFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTwoFingerTap:)];
    
    [doubleTap setNumberOfTapsRequired:2];
    [twoFingerTap setNumberOfTouchesRequired:2];
    
    [scenicImgView addGestureRecognizer:singleTap];
    [scenicImgView addGestureRecognizer:doubleTap];
    [scenicImgView addGestureRecognizer:twoFingerTap];
    
    [singleTap release];
    [doubleTap release];
    [twoFingerTap release];
    
    float minimumScale = [myScrollView frame].size.width  / [scenicImgView frame].size.width;
    [myScrollView setMinimumZoomScale:minimumScale];
    [myScrollView setMaximumZoomScale:1.0];
    [myScrollView setZoomScale:minimumScale];


手势、回调方法如下:

#pragma mark UIScrollViewDelegate methods

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return [myScrollView viewWithTag:ZOOM_VIEW_TAG];
}

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    [scrollView setZoomScale:scale+0.01 animated:NO];
    [scrollView setZoomScale:scale animated:NO];
}

#pragma mark TapDetectingImageViewDelegate methods

- (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer {
    // single tap does nothing for now
}

- (void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer {
    // double tap zooms in
    float newScale = [myScrollView zoomScale] * ZOOM_STEP;
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]];
    [myScrollView zoomToRect:zoomRect animated:YES];
}

- (void)handleTwoFingerTap:(UIGestureRecognizer *)gestureRecognizer {
    // two-finger tap zooms out
    float newScale = [myScrollView zoomScale] / ZOOM_STEP;
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]];
    [myScrollView zoomToRect:zoomRect animated:YES];
}
#pragma mark Utility methods

- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center {
    CGRect zoomRect;
    
    zoomRect.size.height = [myScrollView frame].size.height / scale;
    zoomRect.size.width  = [myScrollView frame].size.width  / scale;
    
    // choose an origin so as to get the right center.
    zoomRect.origin.x = center.x - (zoomRect.size.width  / 2.0);
    zoomRect.origin.y = center.y - (zoomRect.size.height / 2.0);
    
    return zoomRect;
}


参考:http://www.2cto.com/kf/201111/112631.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: