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

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

现在运行一下:

点击back可以切换到主界面,目前这个界面是空的,我们需要向其中增加一些功能按钮。增加三个按钮分别获取模型中的三张图片,并且调整自动布局:

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

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

import UIKitclass 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.fengjing1ivc.title = "风景1"case "fengjing2":ivc.imageURL = DemoURL.Fengjing.fengjing2ivc.title = "风景2"case "fengjing3":ivc.imageURL = DemoURL.Fengjing.fengjing3ivc.title = "风景3"default:break}}}}

现在来运行试试,你会发现点击所有按钮依然只显示默认的图片,这是怎么回事呢?

这是因为我们之前在viewDiaLoad中增加了测试代码,现在把测试代码删掉。再次运行你会看到初始化打开的页面上没有照片,返回到主页面点击按钮选择照片,由于图片很大,按钮会卡顿,在图片加载完成后才会跳转到照片的显示页面。

在现在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 = newValueimageView.sizeToFit()scrollview?.contentSize = imageView.frame.size}}

这里在scrollview尾部增加?是因为在图片变动时不能保证scrollview存在,而oulet和viewDidLoad方法中使用scrollview不用加?是因为在两种情况中scrollview是肯定存在的,这也是保护程序不异常退出的有效方法。现在来运行一下试试,点击按钮时依旧很慢,可喜可贺的是我们可以拖动图像了。

显然现在我们需要添加缩放方法,添加缩放的最好位置是在scrollview的outlet中,记得我们之前讲过的用法首先让ImageViewController遵守scrollview的代理,然后修改如下outlet:

 @IBOutlet weak var scrollview: UIScrollView!{didSet{scrollview.delegate = selfscrollview.maximumZoomScale = 1.0scrollview.minimumZoomScale = 0.05scrollview.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公开课个人笔记47 文件系统Demo

    本话将展示如何使用文件系统保存相机中保存的封面照片,使用一个提前准备好的封面设置Demo,在设置完imageView的image时候把新的图片保存到文件系统中. func imagePickerCon ...

  2. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记20 Multiple MVCs 多MVC模式、NavigationController导航控制器...

    上一话讲完了小人脸Demo,我们也了解了MVC,那么这一话我们来把Demo复杂化,看看多个MVC之间是如何协同工作的.回顾一下我们之前讲过的多个MVC的情况. IOS提供了一些控制器,它们的视图是其他 ...

  3. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记32 NSNotification

    我们之前在讲解MVC模式的时候提到过,模型的改变是通过广播的形式,然后控制器将调到响应的频率接收到模型的消息,找出模型中的变化,这些变化其中之一就是NSNotification,它是MVC中处理电台的 ...

  4. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记24 popovers弹窗

    上几话中我们详细了解了几种segue,我们也了解到了多MVC模式的几种控制器,比如导航.选项卡和分栏,除了这三种多MVC的模式之外,还有一种popover,它跟其他三种不太一样.首先先来认识一下pop ...

  5. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记39 AlertActionSheet

    Alert和ActionSheet是IOS中弹出消息的两个工具. 首先它们都是Modal的方式展示的. Alert用来向用户发起询问,可以有一个(比如取消)或两个选项(比如确定和取消),也可以附带一个 ...

  6. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记15 storyboard中的绘图 MVC模式

    上一话中我们实现了对一个小人表情的绘制,但是我们需要修改代码才能实现表情的变换,而且我们也没有一个明确地模型,这很明显不符合MVC的要求,这一话中我们将要修改它已符合MVC的要求. 在上一话中我们已经 ...

  7. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记23 多MVC模式Demo的实现

    上一话我们对Demo的选择界面做了自动布局的相关处理,现在开始连接多个MVC的操作.首先我们需要其他工程中的文件,那么让我们打开另一个app.点击下面这个文件 然后拖动我们需要的文件到新的工程目录下: ...

  8. 斯坦福iOS7公开课4-6笔记及演示Demo

    1.变量类型别滥用id,如果不仔细容易在程序执行时引发错误,因为在编译阶段编译器只是检测变量对象所属类型,尤其是类型为id时代表任何类型都可以通过检查,但不会检测变量对象调用的方法,这样当对象所属类不 ...

  9. 斯坦福机器学习公开课学习笔记(1)—机器学习的动机与应用

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景         斯坦福机器学习公开课差不多是网上能找到的最好的机器学习入门课程了.现在一共有20节课放 ...

最新文章

  1. 经典爬虫:用Scrapy爬取百度股票
  2. mciSendString 的两个小坑
  3. 修改android4.0的鼠标箭头图标(方法)
  4. 【转】Java中字符串中子串的查找共有四种方法(indexof())
  5. 发送图片微博_微博引流之(实时号养成内幕解析)!
  6. 大剑无锋之Java的深浅拷贝解释一下!
  7. php 跳转到指定url_PHP想要实现页面跳转功能具体怎么操作?(函数标签示例)...
  8. 芯明天debug assertion failed_YJLV铝芯电力电缆的基本介绍
  9. PHP 一个比较完善的文件上传(转).
  10. Linux学习之磁盘操作
  11. Leecode刷题热题HOT100(14)——最长公共前缀
  12. [原创]纯CSS3打造的3D翻页翻转特效
  13. Java 接口中使用数组缺点的理由
  14. mcem r语言代码_生态学数据处理常用R语言代码
  15. android 小米键盘输入法切换,小米输入法键盘设置
  16. uni-app实现微信小程序一键登录
  17. LED发光原理(笔记)
  18. NIM Duilib的基础知识点
  19. 数据库之MySQL日志管理、备份与恢复
  20. 学习虚幻4(一)U3D与UE4的比较

热门文章

  1. 我和51CTO的缘分【我与51CTO一“七”成长】
  2. 哭!有人偷了我的漏洞报告,还冒领了奖金!
  3. 五年来,开源论坛软件MyBB共修复100多个漏洞
  4. GitLab推动基于Kubernetes的Auto DevOps更新
  5. [HeadFirst-HTMLCSS入门][第十章div,span]
  6. R语言页游渠道分析(转)
  7. Android SDCard UnMounted 流程分析(三)
  8. esx4克隆后的处理工作
  9. 6 important .NET concepts: - Stack, heap, Value types, reference types, boxing and Unboxing.
  10. 许晴×××汤的营养价值