zoukankan      html  css  js  c++  java
  • iPad平板电脑程序开发基础规则(源址:http://www.cocoachina.com/bbs/simple/?t82559.html)

     

     

    附上源网址

    iPad开发基础知识

    iPad平板电脑程序开发基础规则

    苹果在今天凌晨发布了10寸平板电脑:iPad。iPad也使用iPhone一样的操作系统,并且也能通过App Store购买软件。开发者们,是不是看到新的市场了?如果您想专门为iPad开发软件,请看看下面的iPad开发规则。

    系统级别
    - 同时只能运行一个程序,窗口占满全屏
    - 程序需要快速进入和退出
    - 为了安全考虑,程序在沙盒内执行。可以保存程序相关的文件和设置。只能通过系统提供的接口与其他程序通信。
    - 每个程序在自己的虚拟内存空间内运行,但是可用虚拟内存只受限于物理内存的大小。就是说没有磁盘虚拟内存。
    - 不支持自定插件和框架。

    程序级别

    - (新增) 程序界面需要支持任意方向。不象iPhone并不要求同时支持横竖屏。
    - 程序主要使用ObjectiveC但是其他程序语言也可以使用
    - 所有在iPhone中支持的类,同样在iPad中支持
    - 内存使用retain/release模型管理
    - 在需要的情况下,程序可以启动额外的线程。不过,基于视图的操作和大量图形操作必须在程序主线程内执行。

    视图控制器

    在iPad里,虽然仍旧支持导航条和Tab条,但是他们的作用逐渐减弱。因为你可以建立一个新的视图控制器,叫做分割视图控制器(Split view controller)。对于更复杂的数据内容,导航条和Tab条主要用来给低层次导航提供支持。

    图形和多媒体

    iPad支持和iPhone一样的图形与多媒体库。视频可以在任意视图内播放,无需始终全屏播放。

    事件处理

    更简单地侦测手势事件。

    设备集成支持

    iPhone很多特性都在iPad内被支持。如:
    - 加速计
    - 位置
    - 地图
    - 设置
    - 地址簿
    - 外设
    - p2p蓝牙连接
    iPad内没有摄像头,但是可以使用像册。

    iPad设备特性

    屏幕尺寸与iPhone不同,iPad是1024x768。

    新增类和接口:
    - Split views 分隔的视图。



    - 弹出窗口


    - 覆盖屏幕的内容可以订制显示风格,设置是否完全覆盖屏幕,还是覆盖窗口的某一部分
    - 工具条可以放在视图的上方或下方
    - 可以自定义虚拟键盘输入视图,与从前iPhone只能在输入框内弹出键盘不同,现在可以在任意获得first responder的对象内设置自定义的输入视图。
    - 虚拟键盘上方还可以放置订制的输入工具

    文字与显示支持

    - 增加Core Text框架
    - 自定义视图可接收键盘消息
    - 增加语法检查类UITextChecker
    - 支持自定编辑菜单类 UIMenuController (注:从前只能通过私有API实现)
    - Core Animation增加CATextLayer类用于显示文字

    支持外部显示器和投影

    iPad可以外接显示器,可输出最大分辨率为720p(1280x720)。

    文档处理支持

    - 应用程序可以注册打开特定类型文件
    - UIKit提供UIDocumentInteractionController类,用于与未知类型文件交互
    - 在Info.plist中带有UIFileSharingEnabled键值的程序可以与用户桌面计算机共享文件。

    但是注意,iPhone OS中并没有提供打开关闭文件的标准对话框,还是不鼓励进行这种系统级别的文件操作。

    PDF生成

    程序可以生成PDF文档。 
    haoxue 2011-11-14 00:05
    iPad软件提交注意事项

    根据自己的iPad软件提交经验总结的注意事项,避免软件被苹果审核人员拒绝放行。

    肯定会被拒的情况:
    1. app命名:不要用类似*** pad的名字,但可以用*** for iPad,*** iPad version之类的名字;
    2. popover相关:
      a. 除非处于任务编辑状态,popover应该随时可以通过点他范围之外的地方来dismiss掉,换句话说,不要用modal方式;
      b. 不要太大,宽度不要超过600;
      c. pickerview啥的一定要放在popover里面,宽度不要拉长
      d. alertview也要用popover的方式出来
    3. 尽量不要使用全屏切换效果(我用了flip导致被拒,不知道curl行不行),好像一定要用全屏的话,可以用modal的方式,这一点我也理解的不是很明 白;

    不会导致被拒但是建议改进的:
    1. 尽量支持4个方向
    2. 少用alertview和全屏视图切换
    3.尽量多用ipad相关的UI element,popover,splitview啥的

    总的感觉,苹果审核比较注重要体现出他和iPhone App的不同之处,以及保证用户体验的流畅性。
    haoxue 2011-11-14 00:06
    iPad用户体验准则

    iPad用户体验最主要体现在内容和交互: 
    • 淡化程序UI,以便用户关注所需的 内容。
    • 美观的内容形式,富有真实感。
    • 充分利用设备的性能来增强内容的交互性。

    支持所有方位
    优秀iPad程序的其中一个重要因素是可以在所有方位上运行。竖向的大屏幕可以满足用户浏览内容的需求


    • 显 示程序为正常显示方式,无论当前iPad是什么方位。避免使用UI元素来告知用户旋转设备。支持180度旋转。
    • 可以特殊处理输入式旋 转动作。有些游戏把旋转设备当成操作方式,这时候横竖屏切换时,可不改变游戏的显示方位。
    增 强交互
    最好的iPad程序在用户执行明确的任务时提供新颖的交互方式。不要为了填满整个大屏幕而增加一些和主要任务没有直接关联的功 能,而是提升程序的用户体验。
    例如读书程序中容许用户阅读时如能保留路径会提升阅读体验,不需要跳转到另外一个页面而是使用气泡框来变更 路径。程序可以让用户在文本中增加书签和注释,帮助用户交换书目或者对比阅读进度。
    信息扁平化
    iPad的大屏幕和新 UI元素可以显示更多的信息,使用的得当可以避免寻找信息时跳转的次数过多,因此也改变iPhone的单屏显示结构。

    使用分栏。两级的内容 同时显示使得信息扁平化。


    使用气泡框。顶部的气 泡框可以显示控件或者工具,不必切换屏幕即可完成操作。

    工具栏中显示分段控件。分 段控件可以显示并列的信息。

    使用标签栏。标签栏显 示不同种类信息或者是不同的程序模块。
    减少全屏切换
    相似的视觉元素,而在某一区域变更内容。普遍的规则是宁愿转换单 独的视图或者组件,也不全屏切换,保证视觉稳定性,帮助用户理解自己所处的位置。
    增强协作和联系
    用户将iPad视为私人设备,但是它合宜的尺寸可以加强真实的协作和分享。
    真实感

    程序显示和现实生活越为相似,用户就越容易理解程序如何操 作并喜欢使用。但也不必过于精确,通常夸张的事物看起来更为真实并能传递更多的意义,当做是和用户交流并表述程序本质的一次机会。使用动画进一步地增强程 序的真实感。通常,动作的真实感比程序的外观更为重要,不符合物理规律的动作会让用户感觉到迷惑。
    令人惊叹的图形

    高分辨率的iPad屏幕所支持丰富、美观和动人的图形 对用户富有吸引力,因此可以尝试增加程序中图形的深度和细节。
    弱化界面控件
    通过设计程序中的UI来组织信息框架,减 少控件的数量和淡化显示效果,创建和程序风格相符的控件,这样既不突出,但又易于发现。
    最少的模态对话框
    模态对话框打断用户的工作流,需用在合适的情况下:
    • 有 必要吸引用户注意力的时候。
    • 避免用户因误操作而导致的数据丢失。

    重新思考列表
    列表气泡框和模态视图有些相似,当气泡框显示时,不能操作主视图。但模态视图是模态的。然而气泡框可以用在两种途 径:
    • 模态。气泡框出现时,周围的界面淡化, 需要一个明确的操作取消。
    • 非模态。点击气泡框周围的界面也可以取消气泡框。

    如果在iPhone中使用了模态视图,可以考虑可以气泡框替代它。以下问题可以帮助你决定气泡 框的使用是否合理:
    • 是否需要不同类型的输入?如果是,使用气泡框。气泡框更适合 显示一个选择器或者列表选项。
    • 是否需要用户穿过多级视图。如果是,使用气泡框。气泡框的结果适合显示多级页面,因为对主视图的改变较 小。
    • 可能在主视图操作才可以完成任务吗?如果是,使用非模态气泡框。因为用户点击主视图即可取消气泡框,容许用户中止操作气泡框并返 回主视图。
    • 任务需要用户深度投入并且是程序的一个主要功能?如果是,可能需要使用模态视图。模态视图的语境转换帮助用户在任务上集中 注意力,较大模态视图便于用户输入大量的字符段。

    从另一方面而言,这个任务代表程序功能的重要一部分,但要 是不需要用户深度投入注意力的话,气泡框是更好的选择,轻量级的视觉对于频繁执行的任务而言更为亲切。
    是否任务执行只有一次或者很少,就 像安装任务。如果是,考虑使用模态视图。用户不会介意为了完成此类任务而停留在当前界面。
    限制模态任务的复杂度
    用户 乐于在一个模态视图中完成一个子任务,因为语境的转换清晰和短暂的。但是如果子任务太复杂,用户会忽视主任务,当模态视图全屏显示并包含多个子视图时,这 种危险会增加。如果模态任务非要包含子视图,确保给予用户一个单独和层次清晰的路径,避免迂回。提供一个明显和安全的方式退出模态任务,用户能预见此操作 的后果。
    淡化文件管理
    尽管iPad程序容许用户创建和操作文件,这并不意味着用户应该对于文件系统有意识。iPad 没有像Mac OS一样的文件搜索,用户也不必想在电脑上一样和文件进行交互。用户不应该考虑文件类型和位置,比如:
    • 打开和保 存对话框中出现文件层级关系。
    • 文件的访问权限信息。
    一个文件处理程序鼓励用户预览内容。如果iPad 程序容许用户创建和编辑文档,最好提供文档种类选择器便于用户打开一个现有文档或者创建新文档。理想情况下的文档选择器为:
    • 高 度图形化。用户看到文档的视觉形式时能很容易识别出需要的文档。
    • 用户使用最少的触摸手势找到需要 的内
      与iPhone程序不同,iPad的工具栏在顶 部,iPad宽大屏幕可以显示工具栏中的所有功能。
      立即启动
      iPad程序启动时用户无须等待即可开始操作。当启动 时,iPad程序:
      • 显示程序在当前方位上的启动图片,减轻用户的等待感,让用户知道程序仍在运行。
      • 避免程 序启动变慢。启动图片
      • 尽快和合理地保存数据。
      • 退出时保存界面的每一个细节。
    haoxue 2011-11-14 00:08
    iPad软件界面设计基本规范
    iPad平台特点
    1 大屏幕,分辨率 1024x768
    2 再次强调没有固定的方向,必须四个方向都支持。
    3 可以外接键盘
    4 可以放置设备,与台式机同步

    iPhone与iPad的共同特点

    - 内存有限
    - 同时运行单个程序
    - 在设置功能里放置程序选项
    - 设备方向可以改变
    - 最小化的帮助,让用户直接就能看懂
    - 程序响应手势而不是鼠标
    - 运行源生程序、Web程序或者二者兼备
    - 图片深度24位(RGB各8位),另带8位alpha通道,建议使用PNG格式图片

    界面简单建议
    - 支持所有方向
    注意要为每个方向都提供一个启动图片
    - 增强交互而非只增加功能
    - 使用split view, 导航和弹出窗口来平整信息层级
    - 减少全屏切换,仅仅改变需要改变的部分
    - 支持协作和互联
    - 如果可能,增加真实感以及物理维度到应用程序里,尽可能像真实世界的物品以便用户易于上手
    - 界面漂亮 用户喜爱
    - 尽量让用户更关注内容而不是界面
    - 尽可能减少强制用户模式化操作
    - 减少使用列表,改变为其他形式
    - 尽量支持多手指手势
    - 让用户模式化操作的地方可以用弹出窗口
    - 限制复杂的模式化操作
    - 减小文件操作尤其尽量让用户感觉不到文件系统的存在
    - 仅仅在必须的情况才提示用户保存
    - 将工具条整合在界面上部
    - 尽可能快速启动程序
    尽量使用截图作为启动画面
    不要在启动时显示关于或者splash screen
    恢复上次运行状态
    尽量不要让用户提供设置信息
    - 程序可能随时停止
    - 为每个方向都准备启动画面
    - 建立漂亮的图标(真机上的显示图标)图片名必须为Icon.png,图片大小必须设置为
    72x72
    尺寸:72x72
    和iPhone程序类似,iPad程序的图标会自动增加:圆角、阴影和高光。
    图标标准:
    > 90度直角边
    > 没有高光
    > 不带alpha通道透明
    - 遵循已有规范 
    haoxue 2011-11-14 00:09
    支持iPad开发的SDK下载

    苹果放出了iPad开发的SDK,请到这个地址下载
    http://www.apple.com/ipad/sdk/ 
    blue_16 2011-11-14 09:40
    看了第一行  吓了一跳...
    老果头 2011-11-14 09:46
      看看
    hao449266 2011-11-14 09:46
    sai373100489 2011-11-14 09:57
    不错  了解了  
    cao_ya_dong 2011-11-14 10:51
          mark  学习
    haoxue 2011-11-15 09:57
    弹出控制器(UIPopoverController)
    《iPad应用开发实战》第2章视图和视图控制器,这一章介绍视图和视图控件。视图(UIView)是应用和用户的视觉交互的主要场所,它也承担了接收手势并且做出响应的任务。
    我们会先讨论它的概念以及常用API,然后介绍其重要子类,包括窗口(UIWindow)和网页视图(UIWebView)。本节为大家介绍弹出控制器(UIPopoverController)。

    弹出控制器(UIPopoverController)
    前面所介绍的导航控制器和标签控制器都是iPhone中的全屏控制器,它们的视图占满整个iPhone屏幕,用于呈现导航信息。但是如果在iPad应用中继续使用它们作为全屏控制器,那么大量的屏幕空间将被浪费。因为iPhone的屏幕分辨率为320×480,而iPad的屏幕分辨率是768×1024。那么怎样在iPad中使用一部分空间来呈现导航信息呢?答案是使用弹出控制器。
    弹出控制器暂时性地使用部分屏幕空间来呈现信息。它的视图会显示在其他视图上方,但是只占用一小块屏幕区域。如图2-4所示,左下角为Saved Photos弹出视图。当用户单击该区域以外任何地方时,它的视图会消失(passthroughViews是一个例外,允许指定一些视图,与它们的交互不会让弹出控制器的视图消失)。
     图2-4   左下角为弹出控制器的视图
    弹出控制器的内容由另外的视图控制器提供,在初始化弹出控制器时,需要为它提供另一个视图控制器,方法是initWithContentViewController。弹出控制器的呈现有两种方法,分别是presentPopoverFromRect:inView:permittedArrowDirecti*****:animated和presentPopover FromBarButtonItem:permittedArrowDirecti*****:animated。前者由一个矩形区域弹出,后者由一个按钮弹出。让弹出控制器消失可以使用方法dismissPopoverAnimated:。
    如果想让弹出控制器随着设备方向旋转,最好的方法是让UIViewController来完成。具体实现方法是,弹出控制器会先将弹出视图隐藏起来,然后在旋转之后重新展现。
    弹出控制器有两个代理方法。popoverControllerShouldDismissPopover:在用户取消弹出视图时被触发;popoverControllerDidDismissPopover:在弹出视图因用户行为被取消后被触发(注意,如果不是因用户行为被触发,而是因为调用了dismissPopoverAnimated:方法,那么这个代理方法不会被触发)。
    haoxue 2011-11-15 11:57
    iOS开发基础:iPad开发注意事项
    分割视图和浮动窗口
    之前花了较长篇幅介绍基于表视图中的选择实现应用程序导航,其中每个选择都会导致顶级视图(填满整个屏幕的视图)滑到左边并调出层次结构中的下一个视图,也可能是另一个表视图。许多iPhone和iPod touch应用程序都以这种方式工作,包括苹果公司自己的应用程序和第三方应用程序。
    一个典型的例子是Mail,它支持在服务器和文件夹中下钻,直到最终找到邮件。从技术上讲,此方法也适用于iPad,但它会导致用户交互问题。在iPhone或iPod touch这样大小的屏幕上,让一个屏幕大小的视图滑走以显示另一个屏幕大小的视图,这没有什么问题。然而在iPad这样大小的屏幕上,同样的交互让人感觉不太对劲,有点夸张,甚至有点让人窒息。此外,在这样大的显示屏上仅显示一个表视图在许多情况下有点浪费。
    所以,你会看到内置的iPad应用程序没有按此方式工作。任何下钻导航功能(比如Mail中所使用的)都移交给了一个较窄的栏,在用户下钻或返回时它的内容会向左或右滑动。在横向模式下使用iPad时,导航栏固定在左侧的一个位置上,所选项的内容在右侧显示。这就是iPad中所谓的分割视图(参见图10-1)。
    分割视图的左侧始终为320像素宽(与纵向模式下的iPhone的宽度相同),分割视图本身并列显示导航栏和内容,并且仅在横向模式下显示。如果将iPad切换为纵向,分割视图仍然有效,但它的显示方式将不同。导航视图不再固定在一个位置,可以点击一个工具栏按钮来激活它,这会导致导航视图弹出一个视图,该视图漂浮在屏幕上所有其他内容的前方(参见图10-2)。这就是所谓的浮动窗口(popover)。


    图1   
    图1:此iPad处于横向模式,显示了一个分割视图。导航栏位于左侧。点击导航栏中的一项(在本例中为特定的邮件账户),该项的内容会在右侧区域中显示 

    图2
    图2:此iPad处于纵向模式,没有显示相同的分割视图。横向模式下分割视图左侧的信息嵌入到了一个浮动窗口中
    在本章的示例项目中,将会介绍如何创建一个同时使用分割视图和浮动窗口的iPad应用程序。
    创建SplitView项目 
    开始的步骤非常简单,利用Xcode预定义的一个模板创建一个分割视图项目。我们将构建一个应用程序,它以与第9章介绍的总统应用程序稍微不同的方式进行显示,列出所有美国总统并显示你所选择的总统的Wikipedia条目。
    转到Xcode并选择File→New Project…。从iOS Application组中选择Split View-based Application。确保清除了Core Data复选框,并将新项目命名为Presidents。Xcode将执行常规的操作,创建一些类和.xib文件,然后显示该项目。展开Classes和Resources文件夹,浏览其中的每一项。
    项目最初包含一个应用程序委托(和平常一样)、类RootViewController和DetailViewCon- troller。这两个视图控制器分别表示将在分割视图左侧和右侧显示的视图。RootView- Controller定义导航结构的顶级视图,DetailViewController定义在选择某个导航元素时在较大的区域中显示的内容。当应用程序启动时,这两部分都包含在分割视图内,你可能还记得,在旋转设备时它们会稍微调整一下形状。
    要查看这个应用程序模板提供了哪些功能,可以在模拟器中构建并运行它。在横向模式(参见图10-3)和纵向模式(参见图10-4)之间切换,就会看到分割视图的实际应用。在横向模式下,分割视图在左侧显示导航视图,在右侧显示详细信息视图。在纵向模式下,详细信息视图占据了屏幕的大部分空间,导航元素被限制在浮动窗口中,点击视图左上角的按钮就会调出该窗口。


    图3
      图3:此屏幕截图显示了横向模式下默认的Split View-based Application模板。请注意此图与图10-1之间的相似性

    图4
    图4:此屏幕截图显示了纵向模式下默认的Split View-based Application模板。请注意此图与图10-2之间的相似性
    我们将以此为基础构建我们想要的总统显示应用程序,但首先来了解一下已经存在的内容。
    xib定义结构 
    很快你就拥有了一组相当复杂的视图控制器:分割视图控制器包含所有元素,导航控制器处理分割视图左侧的操作,根视图控制器位于导航视图内,详细信息视图控制器位于右侧。
    在我们使用的默认的Split View-based Application模板中,这些视图控制器主要在主.xib文件中设置和互连,而不是在代码中。除了进行GUI布局,Interface Builder还允许连接不同的组件,无需编写大量代码来建立关系。我们深入分析一下项目的.xib文件,看一下各项内容是如何设置的。
    在Resources文件夹中,双击DetailView.xib,在Interface Builder中打开它。此.xib文件非常简单,仅包含一个视图(其中有一个标签)和作为其文件所有者的DetailViewController类。在了解了其他控制器如何结合在一起之后,我们会对此文件进行一些更改。现在可以关闭DetailView.xib了。
    回到Xcode中,双击MainWindow.xib,在Interface Builder中编辑它。你一定希望从图标视图切换到列表视图,以更好地了解对象层次结构。图10-5显示了需要查看的所有对象。

    图5
    图5:在InterfaceBuilder中打开的MainWindow.xib。这个复杂的对象层次结构最好在列表模式下结合连接检查器进行查看
    打开连接检查器,单击每个视图控制器,了解它们彼此之间的关系。应用程序委托包含除导航控制器外的其他每个视图控制器的输出口。在其他控制器中,可以看到大部分都没有指向其他控制器的输出口,而一些控制器“包含”一个或多个其他控制器,比如分割视图和导航控制器,分割视图包含导航和细节控制器,导航控制器包含根视图控制器。根视图控制器是个例外,它拥有详细信息视图控制器的输出口,这使它能够在用户的选择更改时更新详细信息视图。
    接下来打开属性检查器并单击每个视图控制器。请注意属性检查器包含一个View Controller部分,该部分包含一个NIB Name字段。对于大部分视图控制器,NIB Name字段都是空的,但对于详细信息视图控制器,它设置为DetailView,回想一下就知道这是我们查看的第一个nib文件的名称。这意味着当加载MainWindow.xib和创建详细信息视图控制器时,该控制器不会在相同nib文件中查找自己的GUI,而是加载所指定的其他nib文件。
    这种设置带来了很高的灵活性,你可以自由决定哪些视图属于主视图和希望将哪些视图放在单独的nib中。在本例中,MainWindow.xib实际包含一个“有趣的”视图控制器,它的视图从一个外部nib文件加载,所有其他视图控制器是表视图控制器(自动创建它们自己的表视图)或容器视图控制器(比如UISplitViewController和UINavigationController),它们从不显示任何可编辑的视图。
    MainWindow.xib中的剩余部分实际上定义了应用程序的各种控制器的互连方式。与大多数使用nib文件的情形一样,这么做消除了大量代码,在大多数时候都是有利的。如果希望在代码中完成所有这些配置,完全可以这么做,但是对于本例,我们将继续使用Xcode所提供的内容。
    代码定义功能 
    在nib文件中完成视图控制器互连的一个主要原因在于,它使源代码不会被不需要存在于这里的配置信息弄得凌乱不堪,因此剩下的只是定义实际功能的代码。首先看一下我们有哪些源代码。Xcode在创建项目时定义了多个类,我们将大概浏览一下它们,然后再进行更改。
    首先是PresidentsAppDelegate.h,它类似于:
    [pre]
      #import <UIKit/UIKit.h>
    1. @class RootViewController;
    2. @class DetailViewController;  
    3. @interface PresidentsAppDelegate : NSObject <UIApplicationDelegate> { 
    4.     UIWindow *window;  
    5.     UISplitViewController *splitViewController;  
    6.     RootViewController *rootViewController; 
    7.     DetailViewController *detailViewController; 
    8. @property (nonatomic, retain) IBOutlet UIWindow *window; 
    9. @property (nonatomic, retain) IBOutlet UISplitViewController *splitViewController; 
    10. @property (nonatomic, retain) IBOutlet RootViewController *rootViewController;  
    11. @property (nonatomic, retain) IBOutlet DetailViewController *detailViewController;  
    12. @end 
    它与目前为止本书中介绍的其他几个应用程序委托非常相似。最大的区别在于其中包含多个控制器的输出口,而不是一个。这使我们能够使用应用程序委托作为一个中央点,可以通过该中央点访问所有控制器。再看一下PresidentsAppDelegate.m中的实现,它看起来类似于以下形式(为了保持简洁,我们删除了大部分注释和空方法):
    [pre]
      #import "PresidentsAppDelegate.h"  
    1. #import "RootViewController.h"  
    2. #import "DetailViewController.h"  
    3. @implementation PresidentsAppDelegate  
    4. @synthesize window, splitViewController, rootViewController, detailViewController;  
    5. - (BOOL)application:(UIApplication *)application 
    6.     didFinishLaunchingWithOpti*****:(NSDictionary *)launchOpti***** {  
    7.     // Override point for customization after app launch.  
    8.     // Add the split view controller's view to the window and display.  
    9.     [self.window addSubview:splitViewController.view];  
    10.     [self.window makeKeyAndVisible];  
    11.     return YES;  
    12. }  
    13. - (void)dealloc {  
    14.     [splitViewController release];  
    15.     [window release];  
    16.     [super dealloc];  
    17. }  
    18. @end  
    [/pre]这里也没有什么新颖的内容,此代码设置应用程序主视图(在本例中为将包含所有其他视图的UISplitViewController)的显示,就像在本书中多次执行的操作一样,最后执行清理。
    现在看一下RootViewController,它控制包含应用程序导航的表视图的设置。RootViewController.h类似于:
    [pre] [/pre][pre]
      #import <UIKit/UIKit.h> 
    1. @class DetailViewController;  
    2. @interface RootViewController : UITableViewController {  
    3.     DetailViewController *detailViewController;  
    4. }  
    5. @property (nonatomic, retain) IBOutlet DetailViewController *detailViewController;  
    6. @end  
    [/pre]与它对应的RootViewController.m文件类似于以下形式(删除了其中的非代码内容):
    [pre]
      #import "RootViewController.h"
    1. #import "DetailViewController.h" 
    2. @implementation RootViewController  
    3. @synthesize detailViewController;  
    4. - (void)viewDidLoad {  
    5.     [super viewDidLoad];  
    6.     self.clearsSelectionOnViewWillAppear = NO;  
    7.     self.contentSizeForViewInPopover = CGSizeMake(320.0, 600.0); 
    8. }  
    9. - (BOOL)shouldAutorotateToInterfaceOrientation:  
    10.     (UIInterfaceOrientation)interfaceOrientation {  
    11.     return YES;  
    12. - (NSInteger)numberOfSecti*****InTableView:(UITableView *)aTableView {  
    13.     return 1;  
    14. }  
    15. - (NSInteger)tableView:(UITableView *)aTableView  
    16.     numberOfRowsInSection:(NSInteger)section {  
    17.     return 10;  
    18. }  
    19. - (UITableViewCell *)tableView:(UITableView *)tableView  
    20.     cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
    21.     static NSString *CellIdentifier = @"CellIdentifier";  
    22.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:  
    23.                                 CellIdentifier];  
    24.     if (cell == nil) {  
    25.         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault  
    26.             reuseIdentifier:CellIdentifier] autorelease];  
    27.         cell.accessoryType = UITableViewCellAccessoryNone;  
    28.     }  
    29.     // Configure the cell. 
    30.     cell.textLabel.text = [NSString stringWithFormat:@"Row %d", indexPath.row];  
    31.     return cell;  
    32. - (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:  
    33.     (NSIndexPath *)indexPath {  
    34.     detailViewController.detailItem = [NSString stringWithFormat:@"Row %d",  
    35.         indexPath.row];  
    36. - (void)dealloc {  
    37.     [detailViewController release];  
    38.     [super dealloc];  
    39. }  
    40. @end  
    这里存在大量逻辑关系,幸好Xcode在分割视图模板中提供了。多数情况下你看到的是一个标准的表视图控制器。但是对于前面给出的与iPad相关的代码,需要指出几个你之前可能未遇到的问题。
    首先,viewDidLoad方法包含一行设置该视图的contentSizeForViewInPopover属性的代码。很容易猜到此方法的用途:它设置此视图控制器在应该显示浮动窗口控制器时将使用的尺寸。这个矩形至少要达到320像素宽,除此之外可以根据你的喜好随意设置它的尺寸。本章稍后将探讨更多浮动窗口问题。
    第二个值得提出的地方是shouldAutorotateToInterfaceOrientation:方法。通常在iPhone应用程序中会指定一种适合所需用途的特定方向。但是在iPad应用程序中,一般建议让用户自行选择显示方式。除非设计游戏(此时需要强制使用特定方向进行显示),iPad应用程序几乎总是希望此方法返回YES。
    shouldAutorotateToInterfaceOrientation是Ipad开发时实现旋转效果的函数!
    需要注意的最后一点是tableView:didSelectRowAtIndexPath:方法。在前面的章节中,当实现用于响应用户行选择的表视图控制器时,通常创建一个新视图控制器并将它推入到导航控制器栈中。但是在此应用程序中,我们希望显示的视图控制器已经存在,它是xib文件中包含的DetailViewController实例,所以我们在这里只需要告诉DetailViewController实例要显示的内容。
    Xcode创建的最后一个类是DetailViewController,它负责用户所选的项的实际显示。我们已经浏览了nib文件DetailView.xib。DetailViewController.h文件类似于以下形式:
    #import <UIKit/UIKit.h> 
      1. @interface DetailViewController : UIViewController <UIPopoverControllerDelegate,  
        UISplitViewControllerDelegate> {  
      1.     UIPopoverController *popoverController;  
        UIToolbar *toolbar;  
      1.     id detailItem;  
        UILabel *detailDescriptionLabel;  
      1. }  
    @property (nonatomic, retain) IBOutlet UIToolbar *toolbar;  
      1. @property (nonatomic, retain) id detailItem;  
    @property (nonatomic, retain) IBOutlet UILabel *detailDescriptionLabel;  
    1. @end  
    除了前面所引用的detailItem属性(在RootViewController类中),DetailView- Controller有两个输出口用于连接到nib文件中的GUI组件(toolbar和detailDescription- Label),还有一个浮动窗口控制器实例变量(稍后将介绍)。
    看一下DetailViewController.m,在其中可以找到以下内容(再次声明,这里进行了一定的删减):
    #import "DetailViewController.h" 
     #import "RootViewController.h" 
      @interface DetailViewController ()  
    @property (nonatomic, retain) UIPopoverController *popoverController;
      - (void)configureView;  
    @end   
    @implementation DetailViewController   
    @synthesize toolbar, popoverController, detailItem, detailDescriptionLabel;  - (void)setDetailItem:(id)newDetailItem {      if (detailItem != newDetailItem) {          [detailItem release];          detailItem = [newDetailItem retain];           // Update the view.          [self configureView];      }       if (self.popoverController != nil) {          [self.popoverController dismissPopoverAnimated:YES];      }         }   - (void)configureView {      // Update the user interface for the detail item.      detailDescriptionLabel.text = [detailItem description];    }   - (void)splitViewController: (UISplitViewController*)svc      willHideViewController:(UIViewController *)aViewController      withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController:      (UIPopoverController*)pc {        barButtonItem.title = @"Root List";      NSMutableArray *items = [[toolbar items] mutableCopy];      [items insertObject:barButtonItem atIndex:0];    [toolbar setItems:items animated:YES];      [items release];      self.popoverController = pc;  }   - (void)splitViewController: (UISplitViewController*)svc  
        willShowViewController:(UIViewController *)aViewController      invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {        NSMutableArray *items = [[toolbar items] mutableCopy];      [items removeObjectAtIndex:0];      [toolbar setItems:items animated:YES];      [items release];      self.popoverController = nil;  }   - (BOOL)shouldAutorotateToInterfaceOrientation:      (UIInterfaceOrientation)interfaceOrientation {      return YES;  }   
    - (void)viewDidUnload {      // Release any retained subviews of the main view.      // e.g. self.myOutlet = nil;      self.popoverController = nil;  }   - (void)dealloc {      [popoverController release];      [toolbar release];         [detailItem release];      [detailDescriptionLabel release];      [super dealloc];  }  @end  你应该熟悉这段代码中的大部分内容,但是这个类包含一些值得注意的新内容。首先是一个所谓的类扩展,它在靠近文件顶部的地方声明:


      @interface DetailViewController ()  @property (nonatomic, retain) UIPopoverController *popoverController;  - (void)configureView;  @end  
    [/pre]类扩展可创建来定义这样一些方法和属性:它们将在一个类中使用,但你不希望向头文件中的其他类公开它们。这里我们声明了popoverController属性和一个实用程序方法,popoverController属性将使用之前声明的实例变量,在需要更新显示时将调用该实用程序方法。我们还未告诉你popoverController属性的应有用途,但你很快就会看到!
    再往下可以看到此方法:
    [pre]
      - (void)setDetailItem:(id)newDetailItem {      if (detailItem != newDetailItem) {          [detailItem release];          detailItem = [newDetailItem retain];            // Update the view.          [self configureView];      }       if (self.popoverController != nil) {          [self.popoverController dismissPopoverAnimated:YES];      }  }  
    [/pre]你可能会对setDetailItem:方法感到惊奇。毕竟我们将detailItem定义为了一个属性,我们合成了它以创建getter和setter,那么为什么在代码中创建setter呢?在本例中,我们需要能够在用户调用setter时作出反应,以便可以更新显示,这是达到此目的的一种不错途径。该方法的第一部分看起来很简单,但在最后它采用了一个调用来解除当前的popoverController(如果存在)。虚构的popupController来自何处?答案就在下一个方法中:
    [pre]
      - (void)splitViewController:(UISplitViewController*)svc      willHideViewController:(UIViewController *)aViewController      withBarButtonItem:(UIBarButtonItem*)barButtonItem      forPopoverController:(UIPopoverController*)pc {        barButtonItem.title = @"Root List";      NSMutableArray *items = [[toolbar items] mutableCopy];      [items insertObject:barButtonItem atIndex:0];      [toolbar setItems:items animated:YES];      [items release];      self.popoverController = pc;  }  
    [/pre]此方法是UISplitViewController的一个委托方法。当分割视图控制器不再固定显示分割视图左侧时(也就是当iPad旋转到纵向时)将调用它。分割视图控制器在委托中调用此方法并传递两个有趣的项:UIPopoverController和UIBarButtonItem。已预先配置UIPopover- Controller来包含分割视图左侧的内容,设置UIBarButtonItem来显示相同的浮动窗口。
    这意味着,如果GUI包含UIToolbar(我们的GUI正是如此),我们只需要在工具栏上添加一个按钮,使用户点击该按钮即可调出导航栏。如果GUI未包含UIToolbar,我们还有传入的浮动窗口控制器,可以将它分配给GUI的其他某个元素,使该元素可以弹出该浮动窗口。我们还传入了包装好的UIViewController本身(在本例中为RootViewController),以防需要以完全不同的方式显示它的内容。
    这就是浮动窗口控制器的来源。你可能已经预料到,下一个方法将解除该浮动窗口:
    [pre]
      - (void)splitViewController: (UISplitViewController*)svc      willShowViewController:(UIViewController *)aViewController      invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {       NSMutableArray *items = [[toolbar items] mutableCopy];      [items removeObjectAtIndex:0];      [toolbar setItems:items animated:YES];      [items release];      self.popoverController = nil;  }  
    [/pre]当用户切换回横向模式时将调用该方法,这时分割视图控制器希望重新在固定位置绘制左侧视图,所以它告诉我们删除之前提供的UIBarButtonItem。
    Xcode的Split View-based Application模板所提供的内容就大体介绍完了。
    接下来,使用尺寸检查器将Web视图锚定到所有4边,使它可以在水平和垂直方向上进行调整(参见图10-7)。要连接创建的输出口,按住Control键并从主nib窗口中的File’s Owner图标拖到我们的新UIWebView,连接webView输出口。保存更改之后,你的工作就完成了!

    图6 尺寸检查器,显示Select a President标签的设置

    图7 尺寸检查器,显示Web视图的设置
    现在可以构建并运行应用程序了,它将会显示每位总统的Wikipedia条目。在两个方向上旋转显示屏,将会看到分割视图控制器为你处理了所有事务,在一定程度上还借助了详细信息视图控制器来处理显示浮动窗口所需的工具栏项(就像在更改之前的原始应用程序中一样)。
    本节最后要进行的更改实际上就是进行美化。当在横向模式下运行此应用程序时,左侧导航视图上方的标题为Root View Controller。切换到纵向模式并单击Presidents工具栏按钮,也会看到相同的标题。
    要改进此效果,可打开MainWindow.xib,双击主nib窗口中的Split View Controller图标,然后双击视图左上部分显示的文本,将它更改为Presidents(参见图10-8)。保存nib文件,返回到Xcode,然后构建并运行,应该会看到更改生效了。
     
    图8 MainWindow.xib内的分割视图控制器。请注意我们将左上角中的标题更改为了Presidents 


    haoxue 2011-11-15 11:59
    iOS开发基础:iPad开发注意事项

    http://mobile.csdn.net/a/20110627/300653.html
    haoxue 2011-11-15 14:34
    终于弄明白iPad UIPopoverController弹出窗口的位置和坐标了 
    TodoViewController *contentViewController = [[TodoViewController alloc] init];
        UINavigationController  *navigationController = [[UINavigationController alloc]  initWithRootViewController:contentViewController];
        navigationController.contentSizeForViewInPopover = CGSizeMake(100, 100); //内容大小
     
        UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navigationController];
        popover.popoverContentSize = CGSizeMake(300, 300); //弹出窗口大小,如果屏幕画不下,会挤小的。这个值默认是320x1100
        
        CGRect popoverRect = CGRectMake(200, 700, 10, 10);
        [popover presentPopoverFromRect:popoverRect  //popoverRect的中心点是用来画箭头的,如果中心点如果出了屏幕,系统会优化到窗口边缘
                                 inView:self.view //上面的矩形坐标是以这个view为参考的
               permittedArrowDirecti*****:UIPopoverArrowDirectionDown  //箭头方向
                               animated:YES];
        
        [contentViewController release];
        [navigationController release];
        
        //最佳实践,使用哪个view做参考,就以哪个view的bounds送进去就好了,箭头自动指向这个view的中心

    haoxue 2011-11-16 09:18
    弹出控制器(UIPopoverController)
    分割视图控制器(UISplitViewController)

    实例:iPad网页导航

    haoxue 2011-11-16 10:14
    视图的子类构成了iPhone和iPad的主要屏幕元素。它们包括:网页视图(UIWebView)、搜索条(UISearchBar)、滚动视图(UIScrollView)、警告视图(UIAlertView)、操作单(UIActi*****heet)、工具条(UIToolBar)、图像视图(UIImageView)、标签(UILabel)和窗口(UIWindow)等。
    haoxue 2011-11-16 10:21
    弹出控制器(UIPopoverController)
    弹出控制器的内容由另外的视图控制器提供,在初始化弹出控制器时,需要为它提供另一个视图控制器,方法是initWithContentViewController。弹出控制器的呈现有两种方法,分别是presentPopoverFromRect:inView:permittedArrowDirecti*****:animated和presentPopover FromBarButtonItem:permittedArrowDirecti*****:animated。前者由一个矩形区域弹出,后者由一个按钮弹出。让弹出控制器消失可以使用方法dismissPopoverAnimated:。
        如果想让弹出控制器随着设备方向旋转,最好的方法是让UIViewController来完成。具体实现方法是,弹出控制器会先将弹出视图隐藏起来,然后在旋转之后重新展现。在本章后面的例子中将解释这是如何完成的。
        弹出控制器有两个代理方法。popoverControllerShouldDismissPopover:在用户取消弹出视图时被触发;popoverControllerDidDismissPopover:在弹出视图因用户行为被取消后被触发(注意,如果不是因用户行为被触发,而是因为调用了dismissPopoverAnimated:方法,那么这个代理方法不会被触发)。


    haoxue 2011-11-16 10:24
    分割视图控制器(UISplitViewController)
    分割视图控制器是iPad专用的全屏控制器(可以尝试在iPhone上使用它,可能会导致程序崩溃)。它使用一小部分屏幕来显示导航信息,然后使用剩下的大部分屏幕来显示相关的详细信息。导航信息由一个视图控制器来管理,详细信息由另一个视图控制器来管理。在创建分割视图控制器后,应当给它的viewControllers属性添加这两个(不能多也不能少)视图控制器。分割视图控制器本身只负责协调二者的关系以及处理设备旋转事件(如弹出控制器一样,最好不要亲自来处理设备旋转事件)。
        分割视图控制器有三个代理方法。
    splitViewController:willHideViewController:withBarButtonItem:forPopoverController:用于通知代理一个视图控制器即将被隐藏。这通常发生在设备由landscape旋转到portrait方向时。
    splitViewController:willShowViewController:invalidatingBarButtonItem:用于通知代理一个视图控制器即将被呈现。这通常发生在设备由portrait旋转到landscape方向时。
    splitViewController:popoverController:willPresentViewController:用于通知代理一个弹出控制器即将被呈现。这发生在portrait模式下,用户单击屏幕上方的按钮弹出导航信息时。
       


    haoxue 2011-11-16 10:36
    下面一节的例子就是基于分割视图控制器的,可以详细了解它的使用。
    基于分割视图控制器的应用
    先建立一个新的工程,模板为Split View-based Application,命名为Websites。直接运行程序,可以在模拟器中看到分割视图在portrait模式和landscape模式下的样子(在iPhone Simulator的Hardware菜单中有Rotate Right和Rotate Left项,以便于选择模拟设备的方向)。如图2-5所示,在portrait模式下,屏幕的绝大部分被详细视图(Detail View)所占据,要想查看导航信息,需要点击屏幕左上方的按钮,来显示一个弹出视图(Popup View)。而在图2-6所示的landscape模式下,详细视图占据约60%的屏幕面积,剩下的部分用一个表格视图(Table View)专门显示导航信息。不论是导航信息还是详细视图中的信息,两种模式下的信息内容都一致,只是显示的方式不同。


                                                                      
                                                                                               图2-5   portrait模式的分割视图

                                                          
                                                                                               图2-6   landscape模式的分割视图
    为了更好地理解应用的工作原理,打开MainWindow.xib文件,在弹出的图标中双击打开Split View Controller。这时可以看到,分割视图中包含两个视图,左侧是表格视图,由RootViewController管理,右侧是详细视图,由DetailViewController管理。
    下面我们要实现的网页导航应用中,表格视图中能显示两组网站,一组是搜索引擎(包括Google和Bing),另一组是新闻(包括FoxNews和NewYorkTimes)。当用户单击表格视图中的任意一项时,在右侧的网页视图中会打开相应的网页。
     

    2.5.2   网页视图
    下面我们来实现网页视图的功能。
    网页视图应当放置在详细视图中。打开DetailView.xib文件,从Library中拖出一个Web View到DetailView视图中,并调整为全屏。在DetailViewController.h中添加以下代码:
    UIWebView* webView;
    @property (nonatomic, retain) IBOutlet UIWebView* webView;
    其中第一句添加在花括号以内,第二句添加到花括号外面。在DetailViewController.m中添加以下代码:
    @synthesize webView;
    [webView release];
    其中第一句添加到@implementation DetailViewController后面,第二句添加到dealloc方法中。最后再次打开DetailView.xib文件,按住Control键的同时,从File誷 Owner拖向网页视图,然后在弹出框中单击webView。这样,我们在视图中添加了网页视图,并从代码中用webView指向这个网页视图。这也是基于xib文件更改视图的基本操作方式,以后不再赘述。
    我们希望网页视图能尽量充满详细视图,并且能让用户拖动,因此需要在IB里做一点改动。打开DetailView.xib,点击网页视图,打开Size Inspector,修改其Autosizing属性,如图2-7所示。如果不这样改动,你的代码最终虽然能够运行,但是网页视图的一部分是看不到的。

                                                                                       
                                                                                  图2-7   修改网页视图的Autosizing属性

    下面添加代码,使得用户选择一个网站时,能够更新详细视图中的webView。具体在哪里添加这些代码呢?详细视图得到更新的流程如下:
    1)用户从表格视图中选择一项。
    2)RootViewController的tableView:didSelectRowAtIndexPath:被触发(这是一个代理方法)。
    3)DetailViewController的setDetailItem:被调用(你可能会发现你找不到这个方法的定义—这个方法在detailItem的属性中得到设置,见随后的小知识)。
    4)DetailViewController的configureView方法被调用,详细视图得到更新。
    在configureView方法当中,加入以下代码:
    // 网页视图加载请求
    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:detailItem]]];
    代码中,loadRequest:方法的参数是NSURLRequest*类型的一个URL请求。这个请求的初始化依赖于detailItem,而detailItem由用户的选择决定。
    小知识:retain属性的默认实现
    为一个对象设置属性,相当于为其定义了getter和(或)setter。我们来看一下retain属性的默认实现。若代码中有以下属性:
    @property (retain) Class* obj;
    @synthesize obj;
    相当于定义了以下的getter和setter:
    -(Class*) getObj {
        return obj;
    }
    -(void) setObj:(Class*)anotherObj {
        if (obj!=anotherObj) {
            [obj release];
            obj = [anotherObj retain];
        }
    }
    注意,在setter当中,我们首先对obj执行release操作,这是因为:如果obj原先已经指向一个对象的话,那个对象已不再需要,就应该释放掉以避免内存泄露;如果obj原先没有指向任何对象,那么它的值为nil,给nil发送消息相当于什么也不做,不会有任何问题。

    2.5.3   表格视图
    在表格视图中,首先设置有多少个section,也就是用多少组网站。打开RootViewController.m文件,修改numberOfSecti*****InTableView:的返回值为2,这样表格视图中就有了两个section,我们就有了两组网站。
    - (NSInteger)numberOfSecti*****InTableView:(UITableView *)aTableView {
        //小节(section)的数目
        return 2;
    }
    接下来为每一个section也就是每一组网站添加标题。添加以下方法:对第一个section,返回@"Search",这样第一组网站的标题就是Search。同理,第二组网站的标题就是News。
    - (NSString*)tableView:(UITableView*)aTableView titleForHeaderInSection:(NSInteger)section {
         if (section==0) {
              return @"Search";
         }
         else {
              return @"News";
         }
    }
    再接下来,设置每一个section中有多少行,也就是每一个组中有多少个网页。修改tableView:numberOfRowsInSection:方法如下:
    - (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section {
        // 每一个小节中的行数
        return 2;
    }
    这样每一组中都有两个网页。
    类似于前面设置section标题,我们设置每一行显示的标题,也就是每一个网站的名称。修改tableView:cellForRowAtIndexPath:方法如下:
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        
        static NSString *CellIdentifier = @"CellIdentifier";
        
        // 重复使用一些单元(cell)
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
            cell.accessoryType = UITableViewCellAccessoryNone;
        }

         // 找出小节和行数
         int section = [indexPath indexAtPosition:0];
         int row = [indexPath indexAtPosition:1];

         // 单元标题
         NSString* cellTitle;
         if (section==0) {
              if (row==0) {
                   cellTitle = @"Google";
              }
              else {
                   cellTitle = @"Bing";
              }

         }
         else {
              if (row==0) {
                   cellTitle = @"Fox News";
              }
              else {
                   cellTitle = @"NY Times";
              }
         }
        
        // 设置这个单元
        cell.textLabel.text = [NSString stringWithFormat:cellTitle, indexPath.row];
        return cell;
    }
    其中cell是每一行的内容(可以包含图片)。找到对应于indexPath的section和row,然后给出相应的标题cellTitle。最后将每一行的文字设置为cellTitle。
    到此为止,我们已经能够显示出完整的导航信息了,但是这些信息还没有与webView联系起来。我们所需要做的是修改tableView:didSelectRowAtIndexPath:方法。定义一个stringURL用于储存所要打开的网址;从indexPath中计算出section和row;根据section和row给stringURL赋值;最后调用DetailViewController的setDetailItem方法,打开相应网页。具体代码如下:
    - (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        // 网站URL 
         NSString* stringURL;

         // 小节和行数
         int section = [indexPath indexAtPosition:0];
         int row = [indexPath indexAtPosition:1];

         // URL
         if (section==0) {
              if (row==0) {
                   stringURL = @"http://www.google.com";
              }
              else {
                   stringURL = @"http://www.bing.com";
              }

         }
         else {
              if (row==0) {
                   stringURL = @"http://www.foxnews.com";
              }
              else {
                   stringURL = @"http://www.nytimes.com";
              }
         }

        detailViewController.detailItem = stringURL;
    }
    至此,一个简单的网页导航应用已经完成,可以运行看看结果,如图2-8所示。


    yls1989921 2011-11-16 10:50
    Mark一下,嘿嘿
    haoxue 2011-11-16 11:16
    GUI
    图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。

    haoxue 2011-11-24 17:44
    对UIPopoverController的使用
    效果如下:




    实现如下:
    首先加入委托:UIPopoverControllerDeleg

    ate
    先创建一个popover和实例化tableview的类(该类的xib文件中,view中就放了一个tablview):
    UIPopoverController *popover;
    popTableViewController *popoverContent;

    在CustomerDetailVC.m放入:

    #import "CustomerDetailVC.h"
    #import "popTableViewController.h"
    @implementation CustomerDetailVC
    //点击Country后面按钮的时候,弹出popover:
    -(IBAction)btnPressed:(id)sender
    {
    popoverContent.oceanaViewController = self;
     
     
     
     popover =[[UIPopoverController alloc]initWithContentViewController:popoverContent];
     
     [popoversetPopoverContentSize:CGSizeMake(330,330)];
     
     popoverContent.contentSizeForViewInPopover=popoverContent.view.bounds.size;
     
     popoverContent.popoverController = popover;
     
     [popoverpresentPopoverFromRect:((UIView *)sender).frame
     
     inView:self.view
     
     permittedArrowDirecti*****:UIPopoverArrowDirectionAny
     
     animated:YES];
     
     [popoverContentrelease];  //在这里popoverContent的retainCount =4;
     
     [popoverContent.myArray release];
    }
    -(void)popoverControllerDidDism
    issPopover:(UIPopoverController*)popoverController{
     
     if (popover){
     
     [popoverdismissPopoverAnimated:YES];
     
     [popoverrelease];
     
     popover=nil;
     
     if(popoverContent != nil) {
     
     [popoverContent release];
     
     popoverContent = nil;
     
     }
     
     }
    }
    //closing popover
    -(void)killPopovers*****ight {
     
     if (popover){
     
     [popoverdismissPopoverAnimated:NO];
     
     }
    }
    在popTableViewController.h文件中:
    #import "CustomerDetailVC.h"
    @class CustomerDetailVC;
    @interface popTableViewController :UIViewController<UITableViewDelegate,UITableViewDataSource>{
     
     IBOutletUITableView *myTableView;
     
     NSMutableArray *myArray;
     
     UIPopoverController  *popoverController;
     
     CustomerDetailVC *oceanaViewController;
     
     NSString*selectStr;
     
     
    }

    @property (nonatomic,retain) UITableView *myTableView;

    @property (nonatomic,retain) NSMutableArray *myArray;
    @property (nonatomic,retain) UIPopoverController*popoverController;
    @property (nonatomic,retain) NSString *selectStr;
    @property (nonatomic,assign) CustomerDetailVC*oceanaViewController;
    实现文件中:
    #import "popTableViewController.h"
    @implementation popTableViewController
    @synthesize myTableView;
    @synthesize selectStr;
    @synthesize myArray;
    @synthesize popoverController;
    @synthesize oceanaViewController;


    -(void)viewDidLoad

    {
     
     [myTableViewsetDelegate:self];
     
     [myTableViewsetDataSource:self];
    }
    - (NSString *)tableView:(UITableView *)tableViewtitleForHeaderInSection:(NSInteger)section{
     
     return@"Name";
    }
    //指定有多少个分区(Section),默认为1
    - (NSInteger)numberOfSecti*****InTableV
    iew:(UITableView *)tableView{
     
     return1;
    }

    //指定每个分区中有多少行,默认为1

    - (NSInteger)tableView:(UITableView *)tableViewnumberOfRowsInSection:(NSInteger)section{
     
     return[myArray count];
    }
    //绘制Cell
    -(UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath {
     
     
     
     staticNSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
     
     UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:SimpleTableIdentifier];
     
     if (cell ==nil) {
     
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZeroreuseIdentifier:SimpleTableIdentifier] autorelease];
     
     }
     
     cell.textLabel.text =[myArray objectAtIndex:indexPath.row];
     
     returncell;
    }
    - (void)tableView:(UITableView *)tableViewdidSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     
     selectStr=[[NSString alloc] initWithFormat:@"%@",[myArrayobjectAtIndex:indexPath.row]];
     
     [oceanaViewController killPopovers*****ight];
     
     [oceanaViewController textGetValue:selectStr];//CustomerDetailVC中的一个方法
     
     [selectStrrelease];
    }



    haoxue 2011-11-24 18:03
    UIPageControl背景

    最近在做项目的时候,因为遇到用PageControl控制显示图片集时,对于亮度比较高的图片PageControl将看不清或者看不见,所以,为了提高可视度,给PageControl加了背景,其实很简单,我也就不多说了,直接上代码。
    [pre]    int pagesCount = 5;    UIPageControl *pageController = [[UIPageControl alloc] init];    pageController.center = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height-15);//设置pageControl的位置    pageController.numberOfPages = pagesCount;    pageController.currentPage = 0;    [pageController setBounds:CGRectMake(0, 0, 16 * (pagesCount - 1) + 16, 16)];// pageControl上的圆点间距基本在16左右    [pageController.layer setCornerRadius:8];    [pageController setBackgroundColor:[UIColor colorWithWhite:0.0 alpha:0.2]];    [self.view addSubview:pageController];[/pre]
    效果如下:
    haoxue 2011-12-09 11:55
    UIPopoverController 的使用方法 Ipad

    1、初始化UIPopoverController
    UIPopoverController *popover = [[UIPopoverController alloc]initWithContentViewController:navigationController];   
    //必须是个 ViewController
    /*且该 ViewController的 viewDidLoad方法中要设置其在popover中的尺寸,如
    self.contentSizeForViewInPopover = CGSizeMake(300.0280.0);
    */


    self.recentSearchesPopoverController = popover;
    recentSearchesPopoverController.delegate = self;    //self要实现UIPopoverControllerDelegate协议

    2、设置当popover弹出时,用户仍可以交互的视图
    // Ensure the popover is not dismissed if the user taps in the search bar.
        popover.passthroughViews = [NSArray arrayWithObject:searchBar];


    3、展现popover
        [self.recentSearchesPopoverController presentPopoverFromRect:self.searchBar.bounds
                                                              inView:self.searchBar
    permittedArrowDirecti*****:UIPopoverArrowDirectionAny
                                                            animated:NO];

    4、消失popover
    //dismiss the popover.
        [recentSearchesPopoverController dismissPopoverAnimated:YES];



    5、实现 UIPopoverControllerDelegate协议的方法
    - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {

    }

    wjatongmu 2011-12-09 13:14
    欢迎Iphone开发的新老朋友加入*****,群已升级至500人,大家帮你解决问题,共同进步!
    haoxue 2011-12-11 21:03
    拜托,这是我个人的学习笔记,供我个人使用的。请不要在里面乱写。 
    请各位不要在我的学习笔记里乱发表言论,这是我私人东西。大家可以学习、参考我写的资料。但请不要在里面乱写。
    haoxue 2011-12-11 21:04
    警告:这是我个人的学习笔记,供我个人使用的。请不要在里面乱写! 请不要在我的学习笔记里乱发表言论,这是我私人东西。
    l00149133 2011-12-12 10:24
    mark之~~~~~~~~~~~~
    haoxue 2012-03-15 17:14
    iPad竖屏(Portrait)尺寸规格说明
    iPad在竖屏模式下,界面区域元素主要由下图所示构成:

    横屏主要尺寸:
    宽度:768px
    高度:1024px
    状态栏(Status Bar)高度:20px
    导航条(Nav Bar)高度:44px
    主内容区域(Main Cotent Area)高度:911px
    标签栏(Tab Bar)高度:49px
    键盘高度:264px

    haoxue 2012-03-15 17:15


    iPad横屏(Landscape)尺寸规格说明
    iPad在横屏模式下,界面区域元素主要由下图所示构成:
    横屏主要尺寸:
    宽度:1024px
    高度:768px
    状态栏(Status Bar)高度:20px
    导航条(Nav Bar)高度:44px
    主内容区域(Main Cotent Area)高度:655px
    标签栏(Tab Bar)高度:49px
    键盘高度:352px
  • 相关阅读:
    KETTLE集群搭建
    初识spark
    利用python操作mrjob实例---wordcount
    hive 优化 (转)
    hive权限管理
    hadoop常用操作命令
    hive的分桶
    Hive HQL基本操作
    hadoop--hive数据仓库
    Hive配置项的含义详解
  • 原文地址:https://www.cnblogs.com/DamonTang/p/2601331.html
Copyright © 2011-2022 走看看