iPad开发

一.iPad开发简介

1.什么是iPad

  • 一款苹果公司于2010年发布的平板电脑
  • 定价介于苹果的智能手机iPhone和笔记本电脑产品之间
  • 跟iPhone一样,搭载的是iOS操作系统

2.iPhone和iPad的区别

  • 屏幕的chicun/分辨率
  • UI元素的排布/设计
    • 由于iPad屏幕比iPhone大,可以容纳更多的UI元素,因此排列方式是不一样的
  • 键盘
    • iPad的虚拟键盘多了个退出键盘的按钮
  • API
    • 共有API的差异

      • 有些API在iPhone和iPad上都能使用,但是显示效果是有差异的
      • 比如,UIActionSheet
    • iPad特有的类
      • UIPopoverController
      • UISplitViewController
  • 屏幕方向的支持
    • iPhone支持3个方向(除了倒置)
    • iPad支持4个方向
    • 开发说明
      • 一般情况下,iPhone应用就一种屏幕方向,要么竖屏,要么横屏(游戏)
      • 其次,苹果官方建议:iPad应用最好同时支持横屏和竖屏两种方向

3.开发细节

  • 设备支持的应用程序

    • iPhone上只能运行iPhone程序
    • iPad上能够运行iPhone/iPad程序
  • 开发过程
    • iPhone和iPad开发的流程是一致的
    • 在iPhone开发中学到的所有知识基本都能用在iPad上

二.QQ空间项目分析,以及适配方案制定

1.技术难点

  • 横屏下的适配

    1. 尺寸大小的变化:横竖屏下尺寸大小的变化
    2. 排列结构的变化:图标从左右排列到上下排列
    3. 按钮的状态变化:横竖屏状态下的按钮显示内容状态不一样

2.屏幕适配方案(回顾)

  • 方案1:手动代码判断
  • 方案2:Autoresizing(iPad出现以后)
    • 局限性

      • 仅仅能解决子控件和父控件之间的相对关系
      • 仅仅能改变位置尺寸,但是横竖屏切换时,不同排列结构无法改变(比如上下排列变成左右排列),控件状态无法改变
    • 用法
      • UIView里面有一个属性autoresizingMask

        • 距离父控件左边的间距是伸缩的

          • UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
        • 距离父控件右边的间距是伸缩的
          • UIViewAutoresizingFlexibleRightMargin = 1 << 2,
        • 距离父控件上边的间距是伸缩的
          • UIViewAutoresizingFlexibleTopMargin = 1 << 3,
        • 距离父控件下边的间距是伸缩的
          • UIViewAutoresizingFlexibleBottomMargin = 1 << 5
        • 宽度跟随父控件宽度进行伸缩
          • UIViewAutoresizingFlexibleWidth = 1 << 1,
        • 高度跟随父控件高度进行伸缩
          • UIViewAutoresizingFlexibleHeight = 1 << 4,
      • 意味着,所有继承自UIView的子控件,都可以使用Autoresizing进行布局
  • 方案3:Autolayout(iOS6.0开始)
    • 优势:

      • 解决任何控件之间的相对关系问题
    • 局限性:
      • 仅仅能改变位置尺寸,但是横竖屏切换时,不同排列方式无法改变
      • 比如,三个控件,控制水平排放和垂直排放
      • 控件与控件之间的耦合性非常强
  • 方案4:Sizeclass(iOS8.0开始)
    • 优势:

      • 可以解决不同屏幕状态下的排列方式和控件样式问题
      • 主要是因为可以区分不同的屏幕尺寸,具体布局还要参照上面方案
    • 局限性:
      • 无法区分iPad的横竖屏
  • 方案5:UIStackView(iOS9.0开始)
    • 简介:

      • 和Android开发中的LinearLayout控件非常相似
    • 学习资料:
    • 优势:
      • 可以非常快速的进行水平或者垂直布局,并且可以设置间距
      • 控件之间的耦合性弱
    • 局限性:
      • 只能实现一些有规律的布局(水平或者垂直)
      • 目前为止,9.0版本过高,依然需要适配低版本

三.iPad横竖屏适配综合案例(QQ空间)开发步骤

1.开发目的

  • 此项目的侧重点在于如何做好iPad的横竖屏适配,不是具体业务逻辑实现

2.搭建项目结构

  • 项目基本配置

    • BundleID
    • 最低部署版本
    • 支持平台,以及横竖屏支持
    • 程序图标,启动图片
  • 划分项目功能模块,创建文件夹结构
    • 项目总共划分为两个大模块

      • 登录模块

        • 主要负责展示登录界面,验证用户名和密码身份,记住密码,自动登录等功能
      • 主页模块
        • 主要负责展示主页各个板块,并完成各个板块间的切换,以及横竖屏适配
    • 文件夹结构创建如下
      • 一开始搭建基本文件结构, 如果后续需要增加功能或模块, 再进行扩展即可, 没必要一次搭建所有的
  • 拖入必要的资源文件和工具类,以及第三方框架
    • 启动图片,程序图标
    • 拖入界面搭建必备资源文件
    • 一些第三方框架可以等使用时再拖入

3.实现QQ空间登录功能

  1. 搭建登录界面

    • 可以实现观察动画效果,将需要做动画的view包装到一个父控件中,方便做动画
  2. 完善界面细节
    • 比如图片拉伸,尺寸大小,文本样式,return key,状态栏颜色等
  3. 封装登录工具类,完成登录验证功能
    • 经验:不要直接把登录验证逻辑写到控制器,抽取出来一个工具类,既可以复用,也可以减轻控制器的负担
  4. 封装提示工具类
    • 将用户名或者密码错误等提示功能抽取到一个工具类,方便复用

      • 如果对应的功能跟控制器没有关系,最好抽取出去
      • 如果当前功能再其他控制器也会用到,最好抽取出去
  5. 完善记住密码,自动登录功能(封装工具类)

4.实现QQ空间主页功能

  1. 搭建QQ空间主页的主结构

    • 分析界面构成(左右各一块,左边显示菜单项,右侧负责显示内容项)
    • 分别针对于左右视图进行布局,做好横竖屏的适配后,再想左右视图内部如何搭建,从大到小
    • 像一些固定的数值(比如横竖屏状态下的菜单栏高度等),放到单独的一个文件中进行管理,方便维护
  2. 完善左侧菜单view(Dock)
    1. 分析界面构成,大致分成三块

      • 上方的头像
      • 中间的菜单
      • 下面的菜单
    2. 先做好三大块视图的横竖屏尺寸适配,然后在具体考虑内部搭建,从大到小
      • 通过观察视图样式, 建议从下往上进行布局
    3. 完善底部菜单的界面实现
      • 需要适配横竖屏的显示样式,可以在layoutSubviews方法中,判断横竖屏,进行布局
    4. 完善中间的菜单
      • 需要适配横竖屏的显示样式,可以在layoutSubviews方法中,判断横竖屏,进行布局
      • 观察内部按钮样式,需要自定义按钮,调整图片和文字显示位置
    5. 完善顶部的头像
      • 需要适配横竖屏的显示样式,可自定义按钮
  3. 设置左侧菜单代理,通知外界内部菜单点击事件
    • 因为左侧菜单分为上中下三部分,所以可以针对每一部分设置一个代理,向外界提供一些代理方法
    • 将上中下三部分的代理,汇总到Dock中,统一提供给外界
  4. 完善右侧视图
    • 当点击不同的菜单时,右侧内容视图,展示不同控制器的视图给用户

5.细节完善

  • 界面细节完善,比如尺寸/颜色等
  • 适当增加动画

四.UIPopoverController的使用

1.UIPopoverController简介

  • 是iPad开发中常见的一种控制器
  • 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController
  • 它只占用部分屏幕空间来呈现信息,而且显示在屏幕的最前面

2.UIPopoverController使用步骤

  • 设置内容控制器

    • 由于UIPopoverController直接继承自NSObject,不具备可视化能力
    • 因此UIPopoverController上面的内容必须由另外一个继承自UIViewController的控制器来提供,这个控制器称为"内容控制器"
  • 设置内容的尺寸
    • 显示出来占据多少屏幕空间
  • 设置显示的位置
    • 从哪个地方显示出来

3.UIPopoverController代码实现

  1. 设置内容控制器

    • 在初始化UIPopoverController的时候传入一个内容控制器

        • (id)initWithContentViewController:(UIViewController *)viewController
    • 更改内容控制器
      • @property (nonatomic, retain) UIViewController *contentViewController;
        • (void)setContentViewController:(UIViewController *)viewController animated:(BOOL)animated;
  2. 设置内容的尺寸
    • 方案1:通过UIPopoverController对象设置

      • @property (nonatomic) CGSize popoverContentSize;
        • (void)setPopoverContentSize:(CGSize)size animated:(BOOL)animated;
    • 方案2:通过内容控制器设置
      • 在iOS7之前

        • @property (nonatomic,readwrite) CGSize contentSizeForViewInPopover;
      • 在iOS7之后
        • @property (nonatomic) CGSize preferredContentSize;
  3. 设置显示的位置
  • 围绕着一个UIBarButtonItem显示(箭头指定那个UIBarButtonItem)
// 围绕着一个UIBarButtonItem显示(箭头指定那个UIBarButtonItem)

// item:围绕着哪个UIBarButtonItem显示
// arrowDirections:箭头的方向
// animated:是否通过动画显示出来 - (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item
permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections
animated:(BOOL)animated;
  • 围绕着某一块特定区域显示(箭头指定那块特定区域)
// 围绕着某一块特定区域显示(箭头指定那块特定区域)

// rect:指定箭头所指区域的矩形框范围(位置和尺寸)
// view:rect参数是以view的左上角为坐标原点(0,0)
// arrowDirection:箭头的方向
// animated:是否通过动画显示出来 - (void)presentPopoverFromRect:(CGRect)rect
inView:(UIView *)view
permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections
animated:(BOOL)animated;
  1. 关闭UIPopoverController

      • (void)dismissPopoverAnimated:(BOOL)animated;
  2. 额外设置
    • 防止点击UIPopoverController区域外消失

      • 问题描述

        • 只要UIPopoverController显示在屏幕上,UIPopoverController背后的所有控件默认是不能跟用户进行正常交互的
        • 点击UIPopoverController区域外的控件,UIPopoverController默认会消失
      • 解决方案
        • 解决办法是设置passthroughViews属性
        • @property (nonatomic, copy) NSArray *passthroughViews;
        • 这个属性是设置当UIPopoverController显示出来时,哪些控件可以继续跟用户进行正常交互
        • 这样的话,点击区域外的控件就不会让UIPopoverController消失了

4.iOS8.0之后的popover

  • 自定义控制器TestViewController为内容控制器
  • 懒加载内容控制器,并设置ios8popover
    1. 初始化控制器

      • _ios8VC = [[Ios8ViewController alloc] init];
    2. 设置控制器的弹出样式为popover
      • _ios8VC.modalPresentationStyle = UIModalPresentationPopover;
    3. 设置弹出位置
      • self.ios8VC.popoverPresentationController.sourceView = self.view;
      • self.ios8VC.popoverPresentationController.sourceRect = sender.frame;
    4. 以modal的形式弹出
      • [self presentViewController:self.ios8VC animated:YES completion:nil];

5.常见错误

  • popover还没消失就被销毁

    • [UIPopoverController dealloc] reached while popover is still visible.
    • 翻译:popover在仍旧可见的时候被销毁了(调用了dealloc)
    • 从错误可以得出结论
      • 当popover仍旧可见的时候,不准销毁popover对象
      • 在销毁popover对象之前,一定要让popover消失(不可见)

6.开发经验

五.iPad(UIPopoverController使用)案例(美团网)开发步骤

1.搭建项目结构

  1. 划分项目功能模块,创建文件夹结构

    • 项目只有一个功能模块

      • 首页
      • 设置导航栏菜单展示,当点击某个菜单时,展示对应的数据
    • 文件夹结构创建
  2. 拖入必要的资源文件和工具类,以及第三方框架(可以使用时再拖入)
    • 启动图片,程序图标
    • 拖入界面搭建必备资源文件
    • 一些第三方框架可以等使用时再拖入
  3. 搭建Storyboard,跳转结构
    • 入口控制器为导航控制器,其根控制器是一个简单的视图控制器

2.首页功能实现

  • 实现导航栏菜单展示

    1. 自定义菜单视图

      • 通过xib文件描述视图界面
      • 提供菜单数据模型,供外界赋值
    2. 创建导航栏上3个菜单视图,以及logo图标
    3. 做好横竖屏适配
    4. 实现菜单点击事件的监听
  • 封装两级菜单控制器
    • 使用xib描述两级菜单
    • 提供两级菜单数据模型,供外界赋值
  • 实现点击菜单时的业务逻辑
    • 在对应的菜单下面,弹出UIPopoverController

      • 设置popoverController的内容控制器
      • 封装数据获取工具类
      • 赋值展示

六.UISplitViewController简介

1.概念

  • 分割视图控制器

2.功能作用

  • 可以实现iPad屏幕下的分屏(左右)

    • 左边:masterViewController
    • 右边:detailViewController
  • 会自适应iPad横竖屏下的布局
    • 可以设置当竖屏状态下,隐藏masterViewController

3.使用方法

  • 创建分割控制器
  • 设置分割控制器viewControllers属性
    • 此属性是一个数组,里面存放两个子控制器
    • 第0个子控制器代表masterViewController
    • 第1个子控制器代表detailViewController
  • 额外设置
    • 设置弹出"轻扫手势"

      • presentsWithGesture
      • 设置是否可以通过"轻扫手势"弹出master控制器
    • 显示模式
      • preferredDisplayMode

        • UISplitViewControllerDisplayModeAutomatic

          • 自动显示
          • 横屏状态下,两个都显示
          • 竖屏状态下,可以通过轻扫手势控制master控制器
        • UISplitViewControllerDisplayModePrimaryHidden
          • 默认master控制器隐藏,但可以通过轻扫手势控制
        • UISplitViewControllerDisplayModeAllVisible
          • 横竖屏下,两个控制器都显示(轻扫手势也无效)
        • UISplitViewControllerDisplayModePrimaryOverlay
          • 默认两个都显示,但可以通过轻扫手势控制

4.开发经验

  • 一般master控制器和detail控制器之间的通讯可以使用通知

七.问题总结

1.iPad开发和iPhone开发的主要区别

  1. 方向支持(iPad支持4个方向,iPhone支持3个方向)
  2. 屏幕尺寸
  3. 启动图片(共同点)
  4. 布局
  5. API(iPad特有API)
  6. 键盘布局

iPad开发(相对于iPhone开发时专有的API)的更多相关文章

  1. iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址(2014年2月19日更新版)

    //转载请注明出处--本文永久链接:http://www.cnblogs.com/ChenYilong/p/3496069.html     编号 iOS-Apple苹果官方文档翻译名称 博文链接地址 ...

  2. iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译

    编号 iOS-Apple苹果官方文档翻译名称 博文链接地址 1 苹果API常用英语名词---iOS-Apple苹果官方文档翻译 http://www.cnblogs.com/ChenYilong/p/ ...

  3. iOS:iPad和iPhone开发的异同(UIPopoverController、UISplitViewController)

    iPad和iPhone开发的异同 1.iPhone和iPad: niPhone是手机,iPad.iPad Mini是平板电脑 iPhone和iPad开发的区别 屏幕的尺寸 \分辨率 UI元素的排布 \ ...

  4. iOS开发UI篇—iPad和iPhone开发的比较

    一.iPad简介 1.什么是iPad 一款苹果公司于2010年发布的平板电脑 定位介于苹果的智能手机iPhone和笔记本电脑产品之间 跟iPhone一样,搭载的是iOS操作系统 2.iPad的市场情况 ...

  5. iPad和iPhone开发区别

    原文:http://mobile.51cto.com/iphone-273895.htm iPad与iPhone 开发区别详解是本文要介绍的内容,先来看看他们的区别. 1.首先我们先从官方发布的SDK ...

  6. 【转】iOS开发UI篇—iPad和iPhone开发的比较

    原文网址:http://www.cnblogs.com/wendingding/p/3918007.html iOS开发UI篇—iPad和iPhone开发的比较 一.iPad简介 1.什么是iPad ...

  7. iPad和iPhone开发的比较

    一.iPad简介 1.什么是iPad 一款苹果公司于2010年发布的平板电脑 定位介于苹果的智能手机iPhone和笔记本电脑产品之间 跟iPhone一样,搭载的是iOS操作系统 2.iPad的市场情况 ...

  8. iphone 开发中使用zbar时遇到的几个典型问题解决方法。

    iphone 开发中使用zbar时遇到的几个典型问题解决方法.   在近期的一个ios项目中使用到了一个二维码扫描库(Qrcode)--ZBar, 期间遇到2个问题.   1. zbar下载后使用其l ...

  9. iPad和iPhone开发的异同

    niPad和iPhone开发的异同   niPad简介 n什么是iPad p一款苹果公司于2010年发布的平板电脑 p定位介于苹果的智能手机iPhone和笔记本电脑产品之间 p跟iPhone一样,搭载 ...

随机推荐

  1. 简单的map转换成Bean的工具

    简单的map转换成Bean的工具 package com.sd.microMsg.util; import java.lang.reflect.Field; import java.lang.refl ...

  2. POJ 2983 Is the Information Reliable?(差分约束系统)

    http://poj.org/problem?id=2983 题意:N 个 defense stations,M条消息,消息有精确和模糊之分,若前边为P.则为精确消息,有两个defense stati ...

  3. http://www.linuxidc.com/Linux/2015-02/114265.htm

    http://www.linuxidc.com/Linux/2015-02/114265.htm

  4. IE10与IMG图片PNG显示不了 WP中的WebBrowser中无法查看PNG格式的图片

    在IE10下,IMG的图片不能是PNG格式的,PNG格式显示不了,JPG显示就可以

  5. velocity-1.7学习笔记

    Velocity是由Apache软件组织提供的一项开放源码项目,它是一个基于Java的模板引擎.通过Velocity模板语言(Velocity Template Language,VTL)定义模板(T ...

  6. java比较器Comparable接口和Comaprator接口

    Comparable故名思意是比较,意思就是做比较的,然后进行排序. 1.什么是comparable接口 此接口强行对实现它的每个类的对象进行整体排序.此排序被称为该类的自然排序 ,类的 compar ...

  7. MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类

    MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型.是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器 ...

  8. 【HDOJ】1504 Disk Tree

    文件可以重名.先按字典序将路径排序,再过滤掉公共前缀.其中的问题是'\'的ASCII比[A-Z0-9]大,将它替换为空格.否则字典序有问题. /* 1504 */ #include <iostr ...

  9. windows平台下VLC2.0.5编译

    windows平台下VLC2.0.5编译说明 时隔一年多,又要搞流媒体了,不过这次是要做流媒体服务器. 暂时决定使用vlc+ffmpeg+live555,虽然听有些前辈说这个组合的性能较差,只能作为学 ...

  10. Linq的延迟

    书名:LINQ: The Future of Data Access in C# 3.0 Learn LINQ and the C# 3.0 Features That Support It http ...