IOS 怎么用UIScrollView来滚动和缩放他的内容第一篇
本篇文章来自于互联网资料翻译
UIScrollView是在IOS最有用的控件之一。他是一个来展现超过一个屏幕的内容的很好的方式。下面有很多的技巧来使用他。
这篇文章就是关于UIScrollView的,深入浅出,看看我们接下来学习的内容:
1:怎么用UIScrollView来展一个比较大的图片
2:当UIScrollView缩放的时候怎么一直保持在中间
3:在UIScrollView里面怎么嵌入一个复杂的视图层次
4:UIScrollView的特性怎么和UIPageControl一起来浏览多个页面的内容
5:创建一个UIScrollView滚动视图在上面能看到下一页和上一页的一部分并且还能看到当前页面。这就像appstore的一个浏览app的一个效果。
这篇文章是IOS5.0以上 xcode4.5的环境
我们开始创建一个项目如下图:

我们填上项目的名字还有你创建appid时候写的公司标识,还有类名字的前缀,设置我们的设备是iPhone我们暂时只支持iPhone的模式,选择单视图模版。选择下一步并且选择保存位置。
由于我们介绍UIScrollView的4个效果,因此我们创建一个tableView,每个cell会出现一个新的视图控制器并且展现一个效果。

上面这个图显示现在你的storyboard是什么样的当你完成的时候。
我们编译UITableView的导航,接下来我们要做的是:
1:打开MainStroyboard.storyboard并且点击系统模版给我们创建的第一个初始化场景。
2:然后我们添加一个UITableViewController从对象库然后放到storyboard。
3:现在选择tableView你刚才添加的然后选择Editor,然后Embed in,NavigationController。
4:选择tableViewController的tableView,并且设置他的cell类型是静态类型的在属性检查器。
5:最后,设置tableView的section是一个,有4个cell,设置cell是basic类型。然后把他们的lables改为Image scroll,Custom View scroll,paged paged with peeking

保存这个storyboard ,并且编译运行。你应该看到你的tableView。如下图:

滚动缩放一个大图片:
我们接下来要做的是学习怎么用UIScrollView来缩放和滚动一个大的图片。
第一步你需要设置这个Viewcontroller,选择ViewController.h 并且添加一个UIScrollView的outlet。让你的Controller符合UIScrollView的UIScrollViewDelegate协议如下
#import <UIKit/UIKit.h> @interface ViewController : UIViewController <UIScrollViewDelegate> @property (nonatomic, strong) IBOutlet UIScrollView *scrollView; @end
然后在在ViewController.m设置实现属性
@synthesize scrollView = _scrollView;
回到storyboard,从对象库拖拽一个Viewcontroller并且设置他的类是Viewcontroller。
点击tableview的Cell crl+点击鼠标左键向一个新的Viewcontroller拖拽,并且弹出一个storyboard segues并且选择push效果。
从对象库拖拽一个UIScrollView到Viewcontroller上并且填充。
然后然后把UIScrollView的输出口连上还有设置Viewcontroller作为UIScrollView的代理。如下图:
现在在Viewcontroller.m中的延展中添加属性和方法。这些属性方法是私有的。
然后添加
@synthesize imageView = _imageView;
现在我们开始设置我们的UIScrollView了在viewDidLoad和viewVillAppear
用下面代码:
- (void)viewDidLoad {
[super viewDidLoad];
//
UIImage *image = [UIImage imageNamed:@"photo1.png"];
self.imageView = [[UIImageView alloc] initWithImage:image];
self.imageView.frame = (CGRect){.origin=CGPointMake(0.0f, 0.0f), .size=image.size};
[self.scrollView addSubview:self.imageView];
//
self.scrollView.contentSize = image.size;
//
UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(scrollViewDoubleTapped:)];
doubleTapRecognizer.numberOfTapsRequired = ;
doubleTapRecognizer.numberOfTouchesRequired = ;
[self.scrollView addGestureRecognizer:doubleTapRecognizer];
UITapGestureRecognizer *twoFingerTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(scrollViewTwoFingerTapped:)];
twoFingerTapRecognizer.numberOfTapsRequired = ;
twoFingerTapRecognizer.numberOfTouchesRequired = ;
[self.scrollView addGestureRecognizer:twoFingerTapRecognizer];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
//
CGRect scrollViewFrame = self.scrollView.frame;
CGFloat scaleWidth = scrollViewFrame.size.width / self.scrollView.contentSize.width;
CGFloat scaleHeight = scrollViewFrame.size.height / self.scrollView.contentSize.height;
CGFloat minScale = MIN(scaleWidth, scaleHeight);
self.scrollView.minimumZoomScale = minScale;
//
self.scrollView.maximumZoomScale = 1.0f;
self.scrollView.zoomScale = minScale;
//
[self centerScrollViewContents];
}
上面的代码看起来有点复杂。因此我们停下来一步步的分析下。
1:第一步,你需要创建一个UIImageView,设置他的Image属性,然后设置UIImageView的坐标,并且添加到UIScrollView上
2:然后我们设置UIScrollView的contentSize,这样做的目的是让UIScrollView知道他自己能向横方向和竖方向滚动多远或者说多少像素。
3:然后向UIScrollView上面添加了两个手势:一个是双击手势来缩小,另一个两个手指单击来放大。
4:接下来我们需要计算UIScrollView的最小缩放比例。缩放比例是1意味着UIScrollView的内容是正常大小展示。小于1,展示内容放大,当
大于1说明内容缩小。为了得到最小缩放比例,你需要计算你缩放多少才能让图片舒适的展示到UIScrollView里根据他的宽度。然后你根据他的高度做相同的计算。最后比较这两个缩放比例的最小的一个设置为UIScrollView最小缩放比例。给你一个缩放比例然后你可以看到整张图片当放大的时候。
5:你设置最大缩放比例为1,因为缩放的比图片分辨率大你看图片会模糊。你设置初始缩放为最小缩放比例。因此这个图片可以开始充分放大。
6:让你的图片永远在UIScrollView中间当缩放时候。
- (void)centerScrollViewContents {
CGSize boundsSize = self.scrollView.bounds.size;
CGRect contentsFrame = self.imageView.frame;
if (contentsFrame.size.width < boundsSize.width) {
contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0f;
} else {
contentsFrame.origin.x = 0.0f;
}
if (contentsFrame.size.height < boundsSize.height) {
contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0f;
} else {
contentsFrame.origin.y = 0.0f;
}
self.imageView.frame = contentsFrame;
}如果UIScrollView的bounds大小大于UIImageView图片frame的大小,那么图片的坐标就是条件为真时计算的结果,相反就是原始坐标。- (void)scrollViewDoubleTapped:(UITapGestureRecognizer*)recognizer {
//
CGPoint pointInView = [recognizer locationInView:self.imageView];
//
CGFloat newZoomScale = self.scrollView.zoomScale * 1.5f;
newZoomScale = MIN(newZoomScale, self.scrollView.maximumZoomScale);
//
CGSize scrollViewSize = self.scrollView.bounds.size;
CGFloat w = scrollViewSize.width / newZoomScale;
CGFloat h = scrollViewSize.height / newZoomScale;
CGFloat x = pointInView.x - (w / 2.0f);
CGFloat y = pointInView.y - (h / 2.0f);
CGRect rectToZoomTo = CGRectMake(x, y, w, h);
//
[self.scrollView zoomToRect:rectToZoomTo animated:YES];
}
1:获得你点击图片的坐标位置.
2:接下来计算缩放比例缩放150%,但是必须限制最大缩放比例
3:然后用第一步计算的位置计算你想要缩放的位置大小。
4:最后,你需要告诉UIScrollView缩放的frame并且加上动画。
- (void)scrollViewTwoFingerTapped:(UITapGestureRecognizer*)recognizer {
// Zoom out slightly, capping at the minimum zoom scale specified by the scroll view
CGFloat newZoomScale = self.scrollView.zoomScale / 1.5f;
newZoomScale = MAX(newZoomScale, self.scrollView.minimumZoomScale);
[self.scrollView setZoomScale:newZoomScale animated:YES];
}
这类似放大的方式。
- (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView {
// Return the view that you want to zoom
return self.imageView;
}
这是UIScrollView缩放机制的灵魂地方。当UIScrollView完成缩放时候你告诉他是哪个视图在UIScrollView里面实现了缩放。
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
// The scroll view has zoomed, so you need to re-center the contents
[self centerScrollViewContents];
}
这个方法是当UIScrollView完成缩放时候,你需要通知视图在UIScrollView中间,否则UIScrollView缩放不自然。
编译运行项目出现上图效果,你可以试着放大缩小滚动。
IOS 怎么用UIScrollView来滚动和缩放他的内容第一篇的更多相关文章
- UIScrollView无法滚动以及超出屏幕的内容无法进行编辑
通过UITextView实现简单的富文本内容编辑,功能按钮包装时遇到些问题,简单记录如下 1.通过UIToolbar将字体设置功能罗列出来,由于功能过多,通过UIScrollView进行滑动控制 1) ...
- iOS开发:解决UIScrollView不滚动的问题
照着书上的Demo(iOS 5.0的教程),在- (void)viewDidLoad里设置scrollView的contentsize,让它大于屏幕的高度,却发现在模拟器中没用,还是不能滚.经过 一翻 ...
- 【iOS系列】-UIScrollView的介绍及结合UIPageControl实现图片播放的实例
[iOS系列]-UIScrollView的介绍及结合UIPageControl实现图片播放的实例 第一:UIScrollView的常用属性 //表示UIScrollView内容的尺寸,滚动范围 @pr ...
- UIScrollView(滚动试图)
UIScrollView(滚动试图) 1.简介 为什么有UISCrollView: 在iOS开发中,由于移动设备的屏幕大小有限,所以不能像PC一样显示很多内容,因此当手机屏幕需要展示的内容较多超出一个 ...
- iOS学习之UIScrollView
一.UIScrollView的创建和常用属性 1.UIScrollView概述 UIScrollView是UIView的子类. UIScrollView作为所有滚动视图的基类. UIScro ...
- iOS开发基础-UIScrollView基础
普通的 UIView 不具备滚动功能,不能显示过多的内容.UIScrollView 是一个能够滚动的视图控件,可用来展示大量的内容. UIScrollView 的简单使用: 1)将需要展示的内容添 ...
- UIScrollView无法滚动的解决办法
如果UIScrollView无法滚动,可能是以下原因: 没有设置contentSize scrollEnabled = NO 没有接收到触摸事件:userInteractionEnabled = NO ...
- UIScrollView无法滚动的解决办法及UIScrollView的代理(delegate)
1•如果UIScrollView无法滚动,可能是以下原因: Ø没有设置contentSize ØscrollEnabled = NO Ø没有接收到触摸事件:userInteractionEnabled ...
- IOS中的UIScrollView
要引用UIScrollView 首先要遵循UIScrollViewDelegate协议 然后重写 //1.拖拽方法 -(void)scrollViewDidScroll:(UIScrollView * ...
随机推荐
- php生成二维码的几种方式[转]
二维码是二维条形码的一种,可以将网址.文字.照片等信息通过相应的编码算法编译成为一个方块形条码图案,手机用户可以通过摄像头和解码软件将相关信息重新解码并查看内容.PHP可以使用php QR Cod ...
- JUnit教程
测试是检查应用程序是否是工作按照要求,并确保在开发者水平,单元测试进入功能性的处理.单元测试是单一实体(类或方法)的测试. 单元测试在每一个软件公司开发高品质的产品给他们的客户是十分必要的. 单元测试 ...
- 绘制你的第一个图表(jquery-flot-line-chart)
事前准备 首先, 请先确定你已经下载了Flot档案, 如果还没有的话可以先回到前一章 去下载. 这是你绘制的第一张图, 我们用最常用的折线图当例子, 折线图常被用来显示一段时间间隔趋势的走向, 常见的 ...
- 本地没问题 服务器 提示 Server Error in '/' Application
一. 先用本机的 IIS 测试,不要用 VS 内附的 Web server,並配置 <customErrors mode="Off"/>,以將真實的錯誤原因顯示出來,看 ...
- php sql纯语句
条件语句CASE CASE WHEN a.business_mark != END as source_type, 条件语句 CASE ELSE CASE WHEN a.business_mark ! ...
- 如何获取模拟器安装的app的位置
你可以死记下地址格式, 但是一旦不同的xcode和模拟器版本改变变了地址, 又得记, 从活动管理器里其实是可以直接查看的: Launch the app in the simulator Open A ...
- Greenplum-cc-web监控软件安装时常见错误
错误error: 1.no pg_hba.conf entry for host “::1”, user “gpmon”, database “gpperfmon”, SSL off 解决: vi ...
- Blender 界面操作
1.旋转场景 使用鼠标中间键旋转整个场景.按住Shift键,再操作鼠标中间键则可平移整个场景. 2.数字键盘功能 数字键盘1.3.7,分别控制场景向前.向后.向上显示. 数字键盘5,可以在正射投影(O ...
- python操作mysql数据库实现增删改查
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: ...
- LINE@生活圈招募好友秘笈
什么是「获得更多好友」页面? 您可从 LINE@ app >管理>获得更多好友 进入此页面. ▼ 「获得更多好友」新介面中,募集好友的四大秘诀 秘诀一.「以社群网站或电子邮件分享」 • ...



