IOS 怎么用uiscrollview不能滚动来滚动和缩放他的内容第一篇

前言:我们希望做出的效果是,实现图片的分页滑动,且每张图片都可以双击或用手指捏合来缩放大小。上一篇讲解UIGestureRecognizer的中,我们介绍的UIPinchGestureRecognizer也可以实现用手指捏合来缩放大小这个功能,这里介绍另外一种方法,直接使用UIScrollView自带的功能实现同样的效果。
实现的大体思路:要实现图片的分页滑动,那么肯定是一个大的ScrollView,而每一张图片都可以放大缩小,那么每张图片imageView必定也在一个scrollView上。
在讲解图片缩放的具体实现之前,我们先来区分几个概念:contentSize、contentOffset 、frame
举个例子:一个ScrollView的frame是(0,0,320,480),contentSize是(960,480)
contentSize&代表scrollview中的全部内容区域,
frame代表scrollview在屏幕中显示的区域,
contentOffset&是scrollview当前显示区域顶点相对于frame顶点的偏移量,如当前显示的是第二幅图,那么它的contentOffset.x就是320;
&1、取得屏幕宽高
& & #define MRScreenWidth& & & CGRectGetWidth([UIScreen mainScreen].applicationFrame)
& & [[UIScreenmainScreen]bounds].size.width &区别?
2、直接上代码吧
#import "MyZoomViewController.h"
#define MRScreenWidth
CGRectGetWidth([UIScreen mainScreen].applicationFrame)
#define MRScreenHeight
CGRectGetHeight([UIScreen mainScreen].applicationFrame)
@interface MyZoomViewController ()
@implementation MyZoomViewController
@synthesize srcollView = _srcollV
@synthesize imageView = _imageV
- (void)viewDidLoad
[super viewDidLoad];
_srcollView = [[UIScrollView alloc]init];
_srcollView.delegate =
_srcollView.userInteractionEnabled = YES;
_srcollView.showsHorizontalScrollIndicator = YES;//是否显示侧边的滚动栏
_srcollView.showsVerticalScrollIndicator = NO;
_srcollView.scrollsToTop = NO;
_srcollView.scrollEnabled = YES;
_srcollView.frame = CGRectMake(0, 0, MRScreenWidth, MRScreenHeight);
UIImage *img = [UIImage imageNamed:@"image1.png"];
_imageView = [[UIImageView alloc]initWithImage:img];
//设置这个_imageView能被缩放的最大尺寸,这句话很重要,一定不能少,如果没有这句话,图片不能缩放
_imageView.frame = CGRectMake(0, 0, MRScreenWidth * 2.5, MRScreenHeight * 2.5);
[self.view addSubview:_srcollView];
[_srcollView addSubview:_imageView];
[_imageView release];
[_srcollView release];
// Add gesture,double tap zoom imageView.
UITapGestureRecognizer *doubleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(handleDoubleTap:)];
[doubleTapGesture setNumberOfTapsRequired:2];
[_srcollView addGestureRecognizer:doubleTapGesture];
[doubleTapGesture release];
float minimumScale = _srcollView.frame.size.width / _imageView.frame.size.//最小缩放倍数
[_srcollView setMinimumZoomScale:minimumScale];
[_srcollView setZoomScale:0.5f];
[_srcollView setMinimumZoomScale:0.25f];
[_srcollView setMaximumZoomScale:3.0f];
[_srcollView setZoomScale:0.5f animated:NO];
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
#pragma mark - Zoom methods
- (void)handleDoubleTap:(UIGestureRecognizer *)gesture
NSLog(@"handleDoubleTap");
float newScale = _srcollView.zoomScale * 1.5;//zoomScale这个值决定了contents当前扩展的比例
CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gesture locationInView:gesture.view]];
[_srcollView zoomToRect:zoomRect animated:YES];
- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center
CGRect zoomR
zoomRect.size.height = _srcollView.frame.size.height /
NSLog(@"zoomRect.size.height is %f",zoomRect.size.height);
NSLog(@"self.frame.size.height is %f",_srcollView.frame.size.height);
zoomRect.size.width
= _srcollView.frame.size.width
zoomRect.origin.x = center.x - (zoomRect.size.width
zoomRect.origin.y = center.y - (zoomRect.size.height / 2.0);
return zoomR
#pragma mark - UIScrollViewDelegate
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
return _imageV
//当滑动结束时
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
//把当前的缩放比例设进ZoomScale,以便下次缩放时实在现有的比例的基础上
NSLog(@"scale is %f",scale);
[_srcollView setZoomScale:scale animated:NO];
#pragma mark - View cycle
- (void)dealloc
[super dealloc];
这个只是实现了单张图片的缩放,但多张图片的也是这个原理。多张图片缩放要注意的是,每张图片frame的设置,一般起点为width * i
1、图片缩放必须实现UIScrollViewDelegate的这两个方法:viewForZoomingInScrollView和&scrollViewDidEndZooming:withView:atScale:。
2、设置最大、最小缩放比,maxinumZoomScale、mininumZoomScale。不要忘记,设置imageview的最大缩放长宽,不然不能实现正常的缩放。&
二、实现简单的单张大图片的滚动显示
阅读(...) 评论()标签:至少1个,最多5个
UIScrollView的是几个UIKit类包括的UITableView和UITextView中的超类。
一个UIScrollView对象(或者,简单地说,一个滚动视图)的核心概念是,它是一个视图,其起源是可调过的内容视图。它剪辑的内容,它的框架,这通常(但不一定)恰逢该应用程序的主窗口。滚动视图跟踪手指的变动,并相应调整原点。这正显示出它的内容“,通过”滚动视图的视图绘制的基础上,新的原点,它被固定在内容视图的偏移部分本身。滚动视图本身没有绘制,除了显示垂直和水平滚动的指标。滚动视图必须知道的内容视图的大小,所以它知道何时停止滚动,默认情况下,它“反弹”回来时,滚动超出了内容的范围。
用于管理内容的绘制有关的对象显示在一个滚动视图应该瓦片的内容的子视图,以便没有视图超过屏幕的大小。当用户在滚动滚动视图,这个对象应该添加和删除子视图是必要的。
由于滚动视图没有滚动条,它必须知道是否触摸信号的意图与滚动意图在内容跟踪一个子视图。做出此决定,它暂时拦截触摸按下事件通过启动一个定时器,并在定时器触发之前,看是否触摸手指做任何运动。如果定时器触发无位置显著的变化,滚动视图将跟踪事件的内容视图的感动子视图。然后,如果用户在定时器期满前拉着自己的手指远远不够,滚动视图将取消任何跟踪的子视图,并进行滚动本身。子类可以重写touchesShouldBegin : withEvent:方法inContentView :,pagingEnabled和touchesShouldCancelInContentView :方法(这是由滚动视图调用)来影响滚动视图如何处理滚动手势。
滚动视图还处理缩放和平移的内容。当用户使一个夹在或向外挤压手势,滚动视图调整偏移量和内容的标度。当手势结束,管理内容视图中的对象应该要更新的内容为必要的子视图。 (请注意,手势可以结束和手指仍可能下跌。 )虽然手势正在进行中,滚动视图不发送任何跟踪调用子视图。
该UIScrollView的类可以有必须采取UIScrollViewDelegate协议的委托。对于缩放和平移工作,委托必须实现viewForZoomingInScrollView :和scrollViewDidEndZooming : withView : atScale : ,此外,最大( maximumZoomScale )和最小( minimumZoomScale )变焦倍数必须是不同的。
方法&&属性:
// 监控目前滚动的位置(默认CGPointZero)
- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)
// 滚动范围的大小(默认CGSizeZero)
// 视图在scrollView中的位置(UIEdgeInsetsZero)
cUIEdgeInsets
// 设置协议
cid&UIScrollViewDelegate&
// 指定控件是否只能在一个方向上滚动(默认为NO)
cBOOL directionalLockE
// 控制控件遇到边框是否反弹(默认为YES)
// 控制垂直方向遇到边框是否反弹(默认为NO,如果为YES,bounces也是YES)
alwaysBounceV
// 控制水平方向遇到边框是否反弹(默认为NO,如果为YES,bounces也是YES)
alwaysBounceH
// 控制控件是否整页翻动(默认为NO)
// 控制控件是否能滚动
// 控制是否显示水平方向的滚动条
showsHorizontalScrollI
// 控制是否显示垂直方向的滚动条
showsVerticalScrollI
// 指定滚动条在scrollerView中的位置
cUIEdgeInsets
scrollIndicatorI
// 设定滚动条的样式
cUIScrollViewIndicatorStyle
indicatorS
UIScrollViewDelegate详解
c//scrollView滚动时,就调用该方法。任何offset值改变都调用该方法。即滚动过程中,调用多次
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
NSLog(@"scrollViewDidScroll");
CGPoint point=scrollView.contentO
NSLog(@"%f,%f",point.x,point.y);
// 从中可以读取contentOffset属性以确定其滚动到的位置。
// 注意:当ContentSize属性小于Frame时,将不会出发滚动
c// 当scrollView缩放时,调用该方法。在缩放过程中,回多次调用
- (void)scrollViewDidZoom:(UIScrollView *)scrollView{
NSLog(@"scrollViewDidScroll");
float value=scrollView.zoomS
NSLog(@"%f",value);
c// 当开始滚动视图时,执行该方法。一次有效滑动(开始滑动,滑动一小段距离,只要手指不松开,只算一次滑动),只执行一次。
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
NSLog(@"scrollViewWillBeginDragging");
c// 滑动scrollView,并且手指离开时执行。一次有效滑动,只执行一次。
// 当pagingEnabled属性为YES时,不调用,该方法
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
NSLog(@"scrollViewWillEndDragging");
c// 滑动视图,当手指离开屏幕那一霎那,调用该方法。一次有效滑动,只执行一次。
// decelerate,指代,当我们手指离开那一瞬后,视图是否还将继续向前滚动(一段距离),经过测试,decelerate=YES
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
NSLog(@"scrollViewDidEndDragging");
if (decelerate) {
NSLog(@"decelerate");
NSLog(@"no decelerate");
CGPoint point=scrollView.contentO
NSLog(@"%f,%f",point.x,point.y);
c// 滑动减速时调用该方法。
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
NSLog(@"scrollViewWillBeginDecelerating");
// 该方法在scrollViewDidEndDragging方法之后。
c// 滚动视图减速完成,滚动将停止时,调用该方法。一次有效滑动,只执行一次。
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
NSLog(@"scrollViewDidEndDecelerating");
[_scrollView setContentOffset:CGPointMake(0, 500) animated:YES];
c// 当滚动视图动画完成后,调用该方法,如果没有动画,那么该方法将不被调用
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{
NSLog(@"scrollViewDidEndScrollingAnimation");
// 有效的动画方法为:
- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated 方法
- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated 方法
c// 返回将要缩放的UIView对象。要执行多次
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
NSLog(@"viewForZoomingInScrollView");
c// 当将要开始缩放时,执行该方法。一次有效缩放,就只执行一次。
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view{
NSLog(@"scrollViewWillBeginZooming");
c// 当缩放结束后,并且缩放大小回到minimumZoomScale与maximumZoomScale之间后(我们也许会超出缩放范围),调用该方法。
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale{
NSLog(@"scrollViewDidEndZooming");
c// 指示当用户点击状态栏后,滚动视图是否能够滚动到顶部。需要设置滚动视图的属性:_scrollView.scrollsToTop=YES;
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView{
return YES;
c// 当滚动视图滚动到最顶端后,执行该方法
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView{
NSLog(@"scrollViewDidScrollToTop");
Tip:判断uiscrollview是向上滚动还是向下滚动
cint _lastP
//A variable define in headfile
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
int currentPostion = scrollView.contentOffset.y;
if (currentPostion - _lastPosition & 25) {
_lastPosition = currentP
NSLog(@"ScrollUp now");
else if (_lastPosition - currentPostion & 25)
_lastPosition = currentP
NSLog(@"ScrollDown now");
// 25 可以是任意数字,可根据自己的需要来设定。
c// 升级版:到达顶部或底部时不会反弹
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
int currentPostion = scrollView.contentOffset.y;
if (currentPostion - _lastPosition & 20
&& currentPostion & 0) {
//这个地方加上 currentPostion & 0 即可)
_lastPosition = currentP
NSLog(@"ScrollUp now");
else if ((_lastPosition - currentPostion & 20) && (currentPostion
&= scrollView.contentSize.height-scrollView.bounds.size.height-20) ){
_lastPosition = currentP
NSLog(@"ScrollDown now");
2 收藏&&|&&17
你可能感兴趣的文章
2 收藏,855
6 收藏,768
11 收藏,4.5k
作者,转载啦啊,谢谢啦
分享到微博?
技术专栏,帮你记录编程中的点滴,提升你对技术的理解收藏感兴趣的文章,丰富自己的知识库
明天提醒我
我要该,理由是:}

我要回帖

更多关于 uiscrollview上下滚动 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信