@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);

@import url(/css/cuteeditor.css);

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);

@import url(/css/cuteeditor.css);

@import url(/css/cuteeditor.css);

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);

@import url(/css/cuteeditor.css);

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);

@import url(/css/cuteeditor.css);

1 View

1.1 简介

UIView表示屏幕上的一块矩形区域,它在App中占有绝对重要的地位,因为IOS中几乎所有可视化控件都是UIView的子类。负责渲染区域的内容,并且响应该区域内发生的触摸事件。

UIView的功能 1.管理矩形区域里的内容2.处理矩形区域中的事件3.子视图的管理 4.还能实现动画 UIView的子类也具有这些功能

图 1 UIView及子类继承关系

1.2 三个结构体 CGPoint、CGSize、CGRect

1)CGPoint  

struct CGPoint { 
      CGFloat x; 
      CGFloat y; 
}; 
typedef struct CGPoint CGPoint;看到这个想必你已经懂了,不再解释。 

2) CGSize

struct CGSize { 
    CGFloat width; 
    CGFloat height; 
}; 
typedef struct CGSize CGSize; 不解释。

3) CGRect

struct CGRect { 
     CGPoint origin; //偏移是相对父视图的 
     CGSize size; 
}; 
typedef struct CGRect CGRect;同样 不解释。 

这三个结构体均在一个头文件里:CGGeometry.h

1.3 视图的最基本属性

frame和center都是相对于父视图的,bounds是相对于自身的

  • frame:是CGRect frame的origin是相对于父视图的左上角原点(0,0)的位置,改变视图的frame会改变center
  • center:是CGPoint指的就是整个视图的中心点,改变视图的center也会改变frame
  • bounds:是CGRect是告诉子视图本视图的原点位置(通俗的说就是,子视图的frame的origin与父视图的bounds的origin的差,就是子视图相对于父视图左上角的位置,如果结果为负,则子视图在父视图外)

图 2

1.4 界面元素:window(窗口)、视图(view)

UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow。iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了。其中这个view称为根视图或是初始化视图,一般也只有一个。

2 创建View对象的方式

有两种方式创建view对象,Interface Builder和Programmatically。

2.1 Interface Builder

最简单的方式是使用图形界面的Interface Builder方法,通过这种方式能够从对象库中拖拽一个view对象到interface,安排它们的层次结构并对其配置,同时能够将这些view连接到代码中,从而实现它们的行为。可以参考《Interface Builder User Guide》文档。若创建完view后,可以在代码中获得view对象的controller,如swift实现为:

var blue:blueViewController! 
blue = storyboard?.instantiateViewControllerWithIdentifier("blue") as! blueViewController; // blue为标识符  

2.2 Programmatically

还可以通过程序进行创建,其中可以使用标准的allocation/initialization模式。默认的initialization方法是initWithFrame,可以该方法初始化view尺寸和相对位置。比如object c实现为:

CGRect viewRect = CGRectMake(0, 0, 100, 100); 
UIView* myView = [[UIView alloc] initWithFrame:viewRect]; 

3 创建和管理subviews的层次结构

管理视图的层次结构对应用开发来说是一个很重要的部分,对视图的组织即影响视图的显示,又影响事件是如何响应的。如图 3所示的Clock应用。

图 3

3.1 增加和移除子视图(subview)

一个UIView里面可以包含许多的Subview(其他的UIView),而这些 Subview 彼此之间是有所谓的阶层关系,这有点类似绘图软体中图层的概念,其中第0层是在最低下,即层数越高越在上层,从而上层的视图会遮住下层的视图。如所示表 1时UIView的常用方法。

表 1 UIView常用方法

Method

usage

addSubview

这个是父视图的方法,通过这个方法能够将一个Subview添加到父视图的subview列表的尾部;

insertSubview

这个是父视图方法,可以将子视图插入父视图subview列表的指定位置;

removeFromSuperview

这个是子视图方法,通过它能够将子视图从父视图的subview列表中移除;

bringSubviewToFront

这个是父视图方法,将Subview往前移动一个图层(与它的前一个图层对调位置);

sendSubviewToBack

这个是父视图方法,将Subview往后移动一个图层(与它的后一个图层对调位置);

exchangeSubviewAtIndex

这个是父视图方法,交互子视图的位置。

如下的程序是在父视图控制器中实现两个子视图之间的切换:

 1 func viewMove(from:UIViewController!,to:UIViewController!){ 
 2     let subViewNun = self.view.subviews.count //为视图的层数,待会将to视图放在最上层。 
 3     if from != nil{ 
 4     from!.willMoveToParentViewController(nil); 
 5     from!.view.removeFromSuperview();//调用子视图方法,从父视图中移除子视图。 
 6     from!.removeFromParentViewController(); 
 7     } 
 8     if to != nil{ 
 9             to. view.frame = view.frame//设置子视图的框架与父视图一样 
10     self.addChildViewController(to!)//将子视图控制器添加到父视图的subview controller列表中 
11     self.view.insertSubview(to!.view, atIndex: subViewNun)//将子视图添加到父视图的subview列表中 
12     to!.didMoveToParentViewController(self) //调用子视图控制器方法,表明视图图发生变化了 
13     } 
14 }  

当添加一个subview到另一个view中,UIKit即会通知父视图,又会通知子视图发生视图内容发生变化了。所以如果实现了定制的view,那么可以通过重载willMoveToSuperview, willMoveToWindow, willRemoveSubview, didAddSubview, didMoveToSuperview或didMoveToWindow方法来拦截这些消息,可以通过这些消息来更新相关的视图层次结构的状态或信息。

3.2 隐藏视图

为了隐藏视图的可见性,可以通过将"hidden"属性设置为yes,或者是将"alpha"属性值设置为0.0。被隐藏的视图不会再从系统中接收到触摸事件,当隐藏的视图还是会参加一些布局操作。其中若需要在隐藏时设置动画操作,那么只能通过修改alpha属性,而不能修改hidden属性,因为hidden不是animation属性。

Important:如果要对第一响应者进行隐藏操作时,那么系统不会取消该视图的第一响应。所以当有消息到来时,仍然会把消息传递给这个被隐藏的视图,若要取消其事件的接收,需要手动进行取消。

3.3 转换、放大和旋转视图

暂无

3.4 转换坐标

暂无

参考文献:view Programming Guide for iOS

4 ViewController

4.1 简介

在mvc设计模式中,controller对象提供特定的逻辑,负责连接应用程序的data和view,而且将data展示给用户。在ios应用程序中,view controller是一个特殊类型的controller对象,可以使用它来展示和管理一系列view,同时能够应用它从一个屏幕转到另一个屏幕。

每种UIView都可以指定一个UIViewController类或子类对其进行管理,当然也不是每种UIView都需要UIViewController类,其中将需要UIViewController的UIView称作content view(内容视图),因为这些content view是应用程序的主要容器。

在storyboard中将UIView和UIViewController合称为scene,并且在storyboard中不能独立存在UIView对象或组件,而是需要将UIView组件放置在UIViewController内(可放置多个),但是在xib文件中却是可以独立存在的。也就是说在content view中可以放置普通的UIView和容器类型的UIView,这样将放置在content view的UIView称为子view,而将content view称作父view。在content view中的子view是于图像的层次结构进行组织的,即上层的view可能会阻挡下层view的视线。如图 1所示的view层次结构,其中RootView需要放置在UIViewController中。

图 4s

View controller类型:

  • custom view controller:这是一种用于表示屏幕显示内容的控制器对象。
  • container view controller:这是一种特殊的view controller对象,它负责管理其它view controller对象,并定义view之间的导航关系。比navigation, tab bar和split view controllers
  • modal view controller:这既是custom view controller,又是container view controller,

图 5

4.2 常用方法

表 2

Method

usage

addChildViewController

向视图控制器容器中添加子视图控制器;

removeFromParentViewController

向视图控制器容器中添加子视图控制器;

transitionFromViewController

交换两个子视图控制器的位置;

willMoveToParentViewController

从视图控制器容器中被移动到另外一个视图控制器,如果没有父视图控制器,将为nil;

didMoveToParentViewController

当从一个视图控制容器中添加或者移除viewController后,该方法被调用。

参考文献:

《Beginning iPhone Development with Swift Exploring the iOS SDK-Apress(2014)》Chapter6

http://blog.csdn.net/chengyingzhilian/article/details/7894276

http://www.gowhich.com/blog/543

Cheng

工具栏可以包含按钮和其他一些控件,但这些项并不是互斥的。

iOS Multiview Applications的更多相关文章

  1. 从零开始学ios开发(十):Multiview Applications(多个xib之前的切换)

    这篇学习的主要内容是Multiview,在我们学习iphone旋转的时候,介绍过多个view的使用方法,不过这里的view和旋转屏幕中所指的多个view是不同的,旋转屏幕中涉及到的多个view是在一个 ...

  2. Adding In-App Purchase to your iOS and OS X Applications

    Adding In-App Purchase to your iOS and OS X Applications In-App Purchase allows you to sell addition ...

  3. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  4. iOS开发——高级技术&内购服务

    内购服务 大家都知道做iOS开发本身的收入有三种来源:出售应用.内购和广告.国内用户通常很少直接 购买应用,因此对于开发者而言(特别是个人开发者),内购和广告收入就成了主要的收入来源.内购营销模式,通 ...

  5. iOS开发系列通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  6. Jenkins 搭建U3D自动发布 IOS

    http://www.cnblogs.com/yinghuochong/archive/2013/09/01/3294940.html 1.安装包,工具略过. 2.插件管理 Subversion Pl ...

  7. IOS中调用系统的电话、短信、邮件、浏览功能

    iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 2015-01-13 09:16 by KenshinCui, 26990 阅读, 35 评 ...

  8. Flash AIR14导出ipa到Mac上的iOS模拟器测试

    没错!你没看错!俺这篇博客就是关于Flash AIR的! ----------------无聊的分割线------------------ 朋友最近学习Flash AIR for iOS开发,想找我帮 ...

  9. iOS开发系列——内购、GameCenter、iCloud、Passbook系统服务开发汇总

    社交 Social 现在很多应用都内置“社交分享”功能,可以将看到的新闻.博客.广告等内容分享到微博.微信.QQ.空间等,其实从iOS6.0开始苹果官方就内置了Social.framework专门来实 ...

随机推荐

  1. The Greate Wall 相关网络知识(一)域名劫持

    什么叫做DNS? DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串 ...

  2. jq总结1

    选择器 /** * 多目标选择器 * 可以选择多个元素或者表达式, * 包装成 jQuery 对象的集合 * 例子:$("div,span") */ $("table t ...

  3. Mongodb在Windows下安装及配置 【转】

    1.下载mongodb的windows版本,有32位和64位版本,根据系统情况下载,下载地址:http://www.mongodb.org/downloads 2.解压缩至E:/mongodb即可 3 ...

  4. git实现版本回退

    1. 首先查看自己的版本: ***:~/piaoshifu_object/epiao.piaoshifu.cn$ git log commit c8d5c67861d2d0e21856cc2b4f60 ...

  5. 【UVA11324】The Largest Clique (SCC)

    题意: 给一张有向图G,求一个结点数最大的结点集,使得该结点中任意两个结点 u 和 v满足:要么 u 可以到达 v, 要么 v 可以到达 u(u 和 v 相互可达也可以). 分析: Tarjan求SC ...

  6. struts2中获取request、response,与android客户端进行交互(文件传递给客户端)

    用struts2作为服务器框架,与android客户端进行交互需要得到request.response对象. struts2中获取request.response有两种方法. 第一种:利用Servle ...

  7. Java多线程(四)之ConcurrentSkipListMap深入分析

    一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下,ConcurrentHashMap 存取速度是ConcurrentSki ...

  8. bzoj2002

    这道题学习了一种简洁的解决一些数据结构题的方法——分块法这道题方法很多,但分块写起来只有1kb左右,非常的简洁(但不是非常的高效)首先很容易思考到一种暴力的做法,从后往前推,很容易搞出每个点会弹几次弹 ...

  9. 深入浅出Node.js (附录A) - 安装Node

    A.1 Windows系统下的Node安装 A.2 Mac系统下Node的安装 A.3 Linux系统下Node的安装 A.4 总结 A.5 参考资源

  10. 【转】Android--多线程之Handler--不错

    原文网址:http://www.cnblogs.com/plokmju/p/android_handler.html 前言 Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了 ...