在上一话中我们创建了一个通过URL读取图片的Demo,这个Demo是不能拖动和缩放的。如今给它添加选项让它能够手动切换URL,并把图片加入到ScrollView中。

向Storyboard中拖入一个splitviewController。把ImageViewController作为detail视图,把project中自带的那个viewcontroller作为rootview,如今storyboard中的场景如图:

如今执行一下:

点击back能够切换到主界面,眼下这个界面是空的。我们须要向当中添加一些功能button。添加三个button分别获取模型中的三张图片,而且调整自己主动布局:

然后我们须要做的是建立过渡。

按住control键拖动button到ImageViewController,选择show detail segue,分别命名为fengjing1、fengjing2、fengjing3。在viewController中设置过渡方法:

import UIKit

class ViewController: UIViewController {

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?

) {
if let ivc = segue.destinationViewController as? ImageViewController,let identifier = segue.identifier{
switch identifier{
case "fengjing1":
ivc.imageURL = DemoURL.Fengjing.fengjing1
ivc.title = "风景1"
case "fengjing2":
ivc.imageURL = DemoURL.Fengjing.fengjing2
ivc.title = "风景2"
case "fengjing3":
ivc.imageURL = DemoURL.Fengjing.fengjing3
ivc.title = "风景3"
default:break
} }
} }

如今来执行试试,你会发现点击全部button依旧仅仅显示默认的图片,这是怎么回事呢?

这是由于我们之前在viewDiaLoad中添加了測试代码。如今把測试代码删掉。

再次执行你会看到初始化打开的页面上没有照片,返回到主页面点击button选择照片,由于图片非常大,button会卡顿,在图片载入完毕后才会跳转到照片的显示页面。

在如今ImageViewController中拖拽一个scrollview,点击约束中的reset to suggested Constraints。

然后把图片放到这个滚动视图中,在代码中生成滚动视图的outlet。

首先要改动的地方是viewDidLoad方法,imageView不再放到view中而是放到scrollview中:

 override func viewDidLoad() {
super.viewDidLoad()
scrollview.addSubview(imageView) }

其次不论什么图片发生变化的地方都须要改动scrollview的尺寸,由于我们须要scrollview一直保持和它上面的imageview同样的尺寸:

outlet中:

@IBOutlet weak var scrollview: UIScrollView!{

        didSet{
scrollview.contentSize = imageView.frame.size
}
}

计算属性image的定义中:

private var image:UIImage? {
get {return imageView.image}
set {
imageView.image = newValue
imageView.sizeToFit()
scrollview?.contentSize = imageView.frame.size
}
}

这里在scrollview尾部添加?是由于在图片变动时不能保证scrollview存在,而oulet和viewDidLoad方法中使用scrollview不用加?是由于在两种情况中scrollview是肯定存在的,这也是保护程序不异常退出的有效方法。如今来执行一下试试,点击button时依然非常慢。可喜可贺的是我们能够拖动图像了。

显然如今我们须要加入缩放方法,加入缩放的最好位置是在scrollview的outlet中。记得我们之前讲过的使用方法首先让ImageViewController遵守scrollview的代理,然后改动例如以下outlet:

 @IBOutlet weak var scrollview: UIScrollView!{

        didSet{
scrollview.delegate = self
scrollview.maximumZoomScale = 1.0
scrollview.minimumZoomScale = 0.05
scrollview.contentSize = imageView.frame.size
}
}

由于scrollview的代理方法是OC风格的,所以即便你没有实现代理方法,也不会报错,如今我们实现须要的代理方法.

选择须要进行缩放的视图,显然是我们的imageView

 func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
return imageView
}

如今执行,然后按住option键能够模拟两个手指的缩放操作,效果例如以下:

【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记30 ScrollView Demo实战的更多相关文章

  1. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记19 为Demo添加手势

    在这一话中我们将应用上一话学到的知识来为Demo添加手势识别,首先添加一个缩放的功能,其次添加一个拖动功能,使得小人的表情可以随着我们的手指改变. 首先来添加一个缩放手势的识别器,我们来到FaceVi ...

  2. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记1 IOS8概述

    首先感谢网易公开课和SwiftV课堂的朋友们辛苦翻译,这个系列是我学习斯坦福IOS8公开课的个人心得体会和笔记,希望能给大家带来启发. 首先我们要知道IOS系统中的结构情况,从贴近硬件的底层到贴近用户 ...

  3. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记2 Xcode、Auto Layout及MVC

    原文链接不知道在哪, 接着上一话来讲,上一话中讲到了MVC,那么MVC在IOS8开发中是如何应用的呢?Paul Hegarty老师给我们展示了一个计算器的Demo,首先新建一个工程,老师把AppDel ...

  4. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记3 Xcode、Auto Layout及MVC

    继续上一话中的计算器Demo.上一话讲到类必须被初始化.类中的属性也必须被初始化,所以你不能仅仅声明而不给它一个处置,那么问题来了,我们从storyboard中拖拽的@IBOutlet为什么仅仅有声明 ...

  5. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记38 Unwind Segue反向过渡

    之前我们接触过了segue,这是IOS中最主要的传递方式,今天来解说一下怎样进行反向的segue. 反向过渡的使用前提是发出过渡的MVC必须是由目标MVC直接或者间接正向过渡来的.反向过渡是唯一不会创 ...

  6. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记35 UITextField文本框

    本话来介绍UIKit框架中的组件UITextField. UItextField(文本框)和Label看起来看像,可是文本框是能够编辑的.在UI中使用文本框要注意.由于在模拟器上面输入文字是能够使用电 ...

  7. 斯坦福iOS7公开课11笔记及演示Demo&访问HTTPS链接下载数据

    这一节主要介绍UITableView以及iPad,Demo为从Flicker下载图片并显示,但是实际过程中发现需要FQ并使用HTTPS连接,所以这次用了两个Demo,一个是课程中的Demo,另一个是简 ...

  8. 斯坦福iOS7公开课10笔记及演示Demo

    这一节主要介绍了多线程中的串行队列以及滚动视图UIScrollView. 1 .多线程 这一节只是简单介绍了多线程的串行队列,即把任务加入线程队列后按顺序逐步执行. (1)目前iOS多线程提供的方法主 ...

  9. 斯坦福iOS7公开课7-9笔记及演示Demo

    这一部分主要介绍了iOS的绘图.手势.协议.block.力学特效动画(包括重力.碰撞.吸附等)以及自动布局的内容. 1.绘图.手势 (1)调用一个自定义的UIView时,可以使用awakeFromNi ...

随机推荐

  1. 神奇的幻方(NOIP2015)(真·纯模拟)

    原题传送门 这是道SB模拟题,NOIP--难度 直接贴代码 #include<iostream> #include<cstdio> using namespace std; , ...

  2. windows下利用线程池完成多任务的分配和运行

    在做项目的过程中有时候为了提升效率,用了多线程的方法来对任务进行分割和应用,后来发现,采用线程池的方法能更好的利用线程资源来计算任务,网上有很多关于如何运行线程池的例子,msdn上也给出了对应的例子: ...

  3. 应用程序已被Java安全阻止

    提示 您的安全设置已阻止自签名的应用程序运行 控制面板-JAVA-安全-例外站点-https://域名或IP/或http://域名或IP/,注意结尾必须要加/否则还是会一直提示被阻止

  4. Mongodb的学习整理(下)

    聚合 aggregate 聚合(aggregate)主要用于计算数据,类似sql中的sum().avg() 语法 db.集合名称.aggregate([{管道:{表达式}}]) 管道 管道在Unix和 ...

  5. js面试总结

    <div id="app"> <button onClick="app()">点击1</button> <button ...

  6. 【原创】BI解决方案选型之ETL数据整合工具对比

    一.背景 在企业BI平台建设过程中,数据整合始终是一切的基础,简单BI项目可以通过存储过程来实现,而复杂.全面.多方异构数据来源等就大大增加了复杂性,存储过程的可管理性.可维护性.容错性等就无法很好的 ...

  7. [BZOJ1052][HAOI2007]覆盖问题 二分+贪心

    1052: [HAOI2007]覆盖问题 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2053  Solved: 959 [Submit][Sta ...

  8. jquery mloading

    在执行jQuery的ajax时,有的时候请求回来会有较长时间,这个时候,如果什么都没有显示,用户会觉得网站卡住了,所以这个时候,来个mloading会使用户体验更好些. 使用方法很简单 将jquery ...

  9. js-offsetX、pageX、clientX、layerX、screenX

    真心地我也是懵逼的 clientX,clientY:针对屏幕有效区域,不包括滚动部分,坐标(0,0)一直在有效区域的左上角 X,Y:            针对屏幕有效区域,不包括滚动部分,坐标(0, ...

  10. Educational Codeforces Round 32

    http://codeforces.com/contest/888 A Local Extrema[水] [题意]:计算极值点个数 [分析]:除了第一个最后一个外,遇到极值点ans++,包括极大和极小 ...