iPad 项目试炼
#iPad 开发
* 大多数 iPhone 上用的类在 ipad 开发都可以使用, 但是有几个类是 iPad 专用的
* iPad 的开发理念不一样, 拥有更大的屏幕, 可以展示更多的东西, 可以显示更多的内容
* UIPopoverController
* 继承死 NSObject, 主管理, 要设置 containerView, 来显示东西, -> 设置大小, -> 设置从哪显示 ,箭头 any ->
* 注意 popoverController 在销毁的时候要先隐藏, 不然会报错
* 内容控制器可以自行设置自己显示在 popover 里的尺寸, 字啊内容控制器自己加载完的时候设置.contentSizeForViewInPopover = ?
* 上面是 iOS7之前的设置, 之后用 preferredContentSize = ?
* 可以设置代理监听是否可以 dismiss 和 dissmiss 了调用, 还有 reposition 重新布局后会调用的方法
* 可以设置从那个 rect 弹出, 传入 inView是参考坐标系
* 有时候想点击外面的区域不让 pop 消失, 要设置一个属性passthroughViews, 将还想要跟用户进行交互的控件放进去,
* iPhone 想实现这个要自己自定义 popView, 或用别人的第三方库
* 那别人的取色框架来用的时候, 如果觉得代码风格不好或者不够严谨, 可以自己改, 抽取出核心代码, 可以以后自己用来改造点东西, 转化一张 png 图片背景色变为白的的话, 直接 representjpeg 那张图片在 writtofile 就可以了
* *
* iPad 中的 modal
* 有点不一样, 展现样式是 多种多样的
* 可以在要 modal 出来的控制器设置 modal 的样式,
* 还可以设置 modal 的过渡样式, 即从哪里出来的动画, 其中的翻页效果只能用在全屏上
*
* UISplitViewController
* *
#bug: 在 xib 或 storybord 里拖线的时候, 加载对象的时候选最前或最后的时候, 或错, 就是拿到的对象错了
#iOS版本判断: [[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){9,3,0}];
#QZone
* 先做个登录界面
* 图片资源多, 单都是有对应作用的
* 登录界面和以前的差不多, 它用的登录框是用图片直接做两个框的背景, 再在背景之上加上 label 和 textField
* 主页显示的分垂直和横屏时候左边的菜单的状态有区分, 要做到能充分利用空间, 先设置了高的话打横高不变,多出屏幕的地方还是存在. 可以哟给你 autoresize, 设置高为 flexble,
* 或者使用 autolayout, 代码实现比较蛋疼繁琐, 可以用别人封装好的分类来简单使用, 就少打很多代码
* 当设备要旋转时会调用 willRotateTo...方法, 这里我们可以判断要旋转到哪个方向, 传给 docker 来决定显示的宽, 记得在初始设置的时候调用这个方法, 不然不一定是什么方向的
* 在横竖屏切换的时候, 擦混入方法告诉控件, 控件中的子控件也获得旋转信息来自己适配横竖屏, 这样就方便管理各个控件的旋转适配
* 按钮的文字和图片的排布可以重新实现方法 drawImageRect....来实现他们的布局
* 当子控件布局时, 使用的父控件的尺寸是当前未旋转的, 但是计算的是旋转后的, 这样会出问题, 需要将子控件的位置也 autoresize 跟随父控件
#美团
* 一般要进行哪个应用的开发, 获取哪个平台的数据, 都要成为其开发者, 有些框架的使用也需要这样
* 在不改变源代码的情况下, 可以用字典来存放对应的值, 可以用 description 来获得对象的地址
* 用 block 来进行回调可以省去很多麻烦, 一个事件对应一个自己的回调, 对于可能会有多个回调的时候就可以互不影响
* 东西不好, 源码写的太烂了可以适当修改, 改到好用
* 搭建 UI 时, 最好打通数据, 我们要先加载元数据, 即类型字段, 描述数据的称谓数据,是抽象的没有具体值的, 它描绘的数据才有具体值.
* 对于城市组数据, 存字符串就好, 不然城市模型太大, 而且会冗余
* 当属性是@property(readonly)时, 只会在没有实现 get 方法的情况下生成 get 方法, 自己实现了 get 方法就不生成了且不会生成成员变量了, 这时候要自己定义这个成员属性
* 既然有些数据如城市, 分类等的是死的, 我们可以先将其保存起来当做本地数据, 而且应用启动时只加载一次, 应该统一用个工具类来管理
* MJ 的框架可以给属性对应一个别名, 在字典转模型的时候就不会因为字典的 key 有关键字而属性的名字不对应的情况, 可以实现方法, 将 key 和属性对应上: replaceKeyFromPropertyName{ return @{@"属性名" : @"字典 key"}}
##单元测试:
* 项目中有个 test 是专门做单元测试的, 且这个 test 中的东西不会包含到应用中,即沙盒中是不存在其中的任何东西的
* 在 test 下新建一个 testCase,它是继承 XCtestCase 的,它的 tagets 是到 test 的,
* 断言: XCTAssert(xx, xxx)
* 方法左边有个运行的小图标, 点击这个就能运行这个方法而不用将整个程序跑起来
* 这个可以将测试代码放在这里, 不会影响源程序的开发和体积, 可以快速的确定某个或几个功能是否正确, 直观看到业务方法对错
* 注意: 但愿测试不能做一些异步的测试, 因为方法执行完就结束了, 数据回不来
* 不能测试 UI 的,
* *
* *
* 在自定义 UIBarButtonItem 的时候, 其宽度会随内部的 View 改变, 通过改变内部的 View, 可以给按钮间弄个间距
* 按钮中的图片也可以设置对齐方式, 再设置内切就可以设置一个间隔
* 设置好 view 的 xib 后, 加载出来可能会有拉伸现象, 避免这个, 可以在管理 xib 的类中在加载方法 initWIthCoder 里设置 self.autoresizingMask = ...None;
* 在弹出的 popView 里, 对于2个 tableView 的, 建议自己写个 view, splitView 用起来比较麻烦
* 如果在 view 中有按钮的, 设置其点击监听可以直接提供方法设置 taget 和 aciton. 内部再用这些设置按钮的事件
* 分类中的 property 只会自动添加声明, 没有实现, 所以要自己实现 不然运行时会报错找不到这个程序
* 因为按钮设置其属性大多数是设置一般的状态, 这些不需要重复写, 可以给按钮设置分来来方便设置这些属性
* *
* 关于分类和地点的下拉, 其中的滚动视图都几乎一样, 可以由2个 tableView 组成, 应该抽出成一个控件, 控件再根据模型来决定要怎么显示
* 可以在自己的工具类中定义一些 typedef , 方便设置 block
* searchBar 里有属性设置是否弹出取消按钮, canshowCancelButton
* 在 formSheet 模式的 modal, 点击 endEditing 不能退出键盘, 实现 - disableAutokeyboarddissmiss = NO;
* 在 autoLayout 下, 改变一个约束, 其他与这个约束有关的控件也会跟着调整位置
* 改变约束后, 想要生效的控件有动画效果, 需要调用约束控件的父控件 layoutIfNeeded 方法, 在 UIViewAnimate 方法中调用
* 弹出菜单的时候把后面的 popoverView给退出, 但是 contentViewC 不能直接拿到所在的 popOver, 这时, 可以用 block 在创建本控制器传给 popOver 时设置其调用 popOver 来 dismiss, 或者, 用 KVC 来取出自己所在的 popOver 来赋值
#warning: KVC 可以通过 key 访问任何属性和成员变量)
* 可以使用 indexOfGroup....来返回一个数组, 这个数组作为整个 table 的组的索引, 它是按照索引来对应组的, 所以索引的顺序应该和 table 数据源提供的组的数据一致
* 可以用 KVC 来获得一个数组里其元素的某个属性的值, 数组里有多个属性有这个值, 所以最后返回的是每个元素的这个属性值的数组
* 也可以调用其属性设计组 indexColor
* 查看重叠的所有 UI 控件: Shift+Control+单击
*
##可以使用判定: NSPredicate 来设定判定条件, 用数组来调用根据判定来过滤出符合的数组来返回: filteredArrayUsingPredicate:, 在判定中, 是用字符串来描述的, 其中 数组中元素属性名 contains 匹配字符串, 其中元素属性可以跟上 OC 的语法, 不过也是在字符串中的, 类似就是调用了 KVC 的方法, i.e. : name.lowercaseString, 一样可以将 name 的字符串转成小写, 也有点想数据库的写法
* 在当控制器 dismiss 的时, 有个属性 isBegingDismiss, 可以判断是否正在 dismiss, 可以根据判断来决定要不要在这个时间段执行什么效果
* 在 collectionView 的 Storyboard 中有默认的一个 cell., 也可以多拖几个 cell 进去, 设定其 reuseIdentifier, 就能在使用 collectionView 的时候从缓存池中找这个标识的 cell,没有就会从 StoryBoard 中找来加载, 在这个 collectionVIew 中定义的 cell 就被它识别了, 所以不用注册, 要是是代码或者 xib 创建的话, CollectionView 不知道其存在, 就不能使用它, 需要 CollectionView 注册这个 cell 才能使用
#问题: 大众被收, 美团没 API,可以尝试开发其他接口的程序
Github:GitHub API v3
Weibo:API - 微博API
Twitter:https://dev.twitter.com/
Dribbble:Dribbble Developer
Angelist:API - AngelList
Nytimes:http://developer.nytimes.com/docs
(这个是从西乔的文章听说的),使用这个API,开发者可以调用到几百万份结构化过的数据,从1981 年至今,纽约时报报道的事件,畅销书,甚至房地产等等。
Instagram:https://www.instagram.com/developer/
什么还嫌不够,来吧,想要什么API 搜索吧。。。
APIs.io - the API search engine
ProgrammableWeb
#bug: CUICatalog: Invalid asset supplied: (null), or invalid scale factor:1.000..
———– 当设置图片传空壶有这个警告或者传入的图片找不到
#bug: 当点击菜单按钮时, 崩溃, reason: ‘-[UITableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:]: row (2) beyond bounds (0) for section (0).’ —–
——-点击菜单后, 里面有对 tableView selectRow 的操作, 滚动到某一行, 但是这行不存在, 因为这个 tableView 的数据没有, 所以在初始化的时候必须要有数据, 才能这样操作
##iPad 的自动布局, 设置 collectionView 的 item 间距等
* 一般自动布局的话我们是调整约束, 在collectionViewController 中可以通过 self.collectionViewLayout 或者 self.collectionView.collectionViewLayout, 拿到的是父类,抽象类, 我们需要转成 UICollectionViewFlowLayout 才能设置更多的属性
* .minimumLineSpacing, 最小行间距
* .minimumInteritemSpacing, 最小列间距
* .itemSize , 设置每个 cell 的尺寸
* 在计算即将转的方向后的尺寸时, 要拿即将转的方向的数据来算, 像宽度, 即将转的话将是高度作为宽度, 我们当前算就是要拿高度来算
##改变 autoLayout 的约束
* 可以代码拿到, 也可以连线, 改变其 const 值,
* 可以在 drawRect 中画线来当做文字的删除线
* 标记最新: 拿到日期和今天的日期比较后决定显示或隐藏最新标记, 用字符串 compare 方法, 判断 NSOrdered...
##空白处理
* 当没有对应的数据时应该进行空白处理,
* 对于展示的图片可以自定义 ImageView, 设置其特有属性: didMoveToSuperview 方法中设置自动布局, 和父控件没有边距
* 在刷新数据的数据源方法时, 控制空白 View 的可见性
* 当选择后会从新获取数据, 这时应该让视图有下拉刷新的动画行为 ,告诉用户已经执行, 调用 MJ 刷新控件, 直接用 self.collectionVIew headerBegingRRefreshing] 就可以
* 页码默认是一, 没词配置参数时, 将上一次的拿来+1就可以, 即是创建默认是1也不要紧, 会改的
* 当 collectionView 的 cell 没有超过一个屏幕时, 默认是不能拖拽的, 要设置 scrollView 的属性: alwaysBounceVertical = yes
##详情页
* 需要加载网页上的内容 , 模型中有详情页, 但是直接加载网页的内容的话会有些不想要的 元素 , 我们需要通过 js 代码, 将加载网页中的内容去掉, 只留下对应标签, 这需要 OC 调用JS,
* MJ 框架中包装了一个宏, 使用这个宏就可以把自定义的类加上 NSCoding 和 Decoding