1.1、Xcode必备开发技巧和知识
----------
View能显示是因为上面有一个Layer
----------
xcode里的sample code到 官方网页里下载 (默认xcode里只能看不能下载)
https://developer.apple.com/library/ios/navigation/
可以下载samplecode 工作的时候下载示例运行看一遍 用到的时候可以找到这个示例代码
各种控制器、view、框架的sample code重点 框架开发指南 版本更新记录
------
CALayer 核心动画 用的最多的就是 转场动画
实际开发中我们不用CALayer核心动画 而是用UIView自带的动画
[UIView begin…block
因为动画执行结束不会反弹 frame位置真实改变 内部也封装了核心动画的转场动画
但是唯一缺点就是转场动画的选项只有几个
而CALayer会反弹 需要设定为不反弹 不结束 frame位置其实没有改变
-------------------
OC常用方法的定义:直接调用方法 区别于C语言的方法定义
方法定义在CoreFoundation框架里的方法一般是C语言的方法
--------------
ARC和非ARC都要release的地方
在quartz2d中 如果方法中有 Create 单词出现就必须release
//OC方法
//这个也可以释放C语言的方法
------
桌面上右键 -》显示简介 获取桌面的地址 eclipse不会用也没关系
--------
新浪接口文档: 新浪服务器工作人员提供数据给前端的东西 URL地址 请求参数名称 返回结果
面向接口编程 思想: 接口创作者 需要提供一个简单的地址或者 创建方法 自动返回给完整的东西
-----------
spotlight搜索文件速度极快 同事支持文件和文件夹搜索
找到想用的框架框架 直接拖到项目中
-----------
结构体转对象
对象转Point类型 (结构体类型)
----------
方法名提示
-------
允许某个程序相册访问权限
相册位置 setting -> privacy ->photos ->应用程序 switch开关打开
---------
view视图的几个初始化方法
initWithCoder awakeFromNib xib或者storyboard自动调用 initWithCoder在前
initWithFrame [[自定义veiw alloc] init] 或者 [[自定义view alloc] initWithFrame] 都会调用这个方法
intiWithStyle [[自定义view alloc] initWithStyle]会调用
建议以后都这么写 这样不管是代码创建 还是xib创建 都自动调用对应的方法 setup里做初始化操作
-(instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // } return self; }
因此如果既有xib又通过代码 推荐自定义xib+view 同时使用 initWithCoder(xib 最先调用) 和 initWithStyle (代码init自动调用)
2个代码里面都调用一个方法 abc
这样不管哪个方法被执行都进入 abc
在方法abc里创建九宫格
-----------
自定义storyboard-view-子view添加一个属性名称为delegate 就可以在storyboard里右击这个子view看到 delegate 就可以拖线了
------------
手机里面2个一样的程序 需要修改其中一个的 bundle identifier
改为cn.itcast.xxooo
----------------
layoutSubviews view加载的时候一定会调用 来布局子视图用的
--------------
禁止按钮的点击事件 这样才能监听按钮的触摸时间
-----------
重写每次执行drawRect 会有缓存 所以需调用前清空缓存
有自定义strongboard xib-view
设置这个view为clearcolor并且drawRect方法里加上CGContextClearRect(ctx,rext);
(
这里是解释:
如果storyboard-view背景色为Default的时候drawRect会有缓存 需要设置为clear color 同时严禁点drawRect每次调用前CGContextClearRect(ctx,rext);清空一下
如果不清空会出现下次drawRect的时候 改变storyboard-view背景色 上次的绘制还在 所以需要CGContextClearRect(ctx,rext);
)
----------
代码创建button的时候 button的类型应该是Custom 如果是System会有默认的灰色背景和字体颜色为蓝色
---------
frame(相对于父控件的坐标origin.x size ) center(中心点相对于父视图的位置) bounds(一般只用到其size属性 因为左上角坐标为0)
view.layer.position(相对父layer的位置p)
view.layer.ancher(相对于自己身上的钩子 锚点 默认为0.5,0.5);
---------
工作中一般用View少用layer 因为layer不能监听事件
-----
CoreGraphic框架(头文件里导入了quartz core框架) 是跨平台的 而UIkit框架只能用于iphone 所以UI需要转成CG的
CALayer layer 其他属性
layer.contens 辅助视图 保存的是UI元素 转成CG元素 再转成id
self.customView.layer.contents = (id)[UIImage imageNamed:@"me"].CGImage;
self.iconView.layer.borderColor = [UIColor purpleColor].CGColor; self.iconView.layer.cornerRadius = 10; // 设置超出主图层的部分剪切掉 // self.customView.clipsToBounds = YES;
------
拖拽注意点
[pan setTranslation:CGPointZero inView:pan.view];
--------
继承UIResponder叫做 响应者对象 UIView就是
具有- (void)touchesBegan方法 可以监听传递来的事件
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 关闭隐式动画
// [CATransaction begin];
// [CATransaction setDisableActions:YES];
// 隐式动画
self.layer.backgroundColor = [UIColor greenColor].CGColor;
// self.layer.bounds = CGRectMake(0, 0, 200, 200);
self.layer.position = CGPointMake(200, 200);
// self.layer.position // 如何查看CALayer的某个属性是否支持隐式动画, 查看头文件是否有 Animatable
// [CATransaction commit];
}
--------------------
drawRect的执行时间
UIView对象第一次加载完成后 会 setNeedsDisplay 里面调用一次drawRect空方法
如果自定义View继承UIView需要重写UIView的drawRect方法 因为UIView的drawRect方法默认是空的
自定义myLayer继承Layer 因为是Layer类继承NSObject 里面没有drawRect方法 所以需要重写drawRect方法 并且执行mylayer setNeedsDisplay 内部自动调用 drawRect方法
myLayer还可以自己不用实现drawLayer方法 当myLayer setNeedsDisplay]后 发现self.delegate有对象s ,会让s来代为执行 drawLayer方法
1、自定义layer 需要手动调用 setNeedsdisplay 来调用drawRect方法
[mylayer setNeedsdisplay]
[self.view layer addSublayer:myLayer];
2、自定义layer设置delegate 那么setNeedsDisplay方法会调用delegate的drawRect方法
// // NJViewController.m // 02-自定义Layer #import "NJViewController.h" #import "NJLayer.h" @interface NJViewController () @end @implementation NJViewController - (void)viewDidLoad { [super viewDidLoad]; // 1.创建自定义Layer CALayer *myLayer = [CALayer layer]; myLayer.bounds = CGRectMake(0, 0, 100, 100); myLayer.anchorPoint = CGPointZero; myLayer.backgroundColor = [UIColor greenColor].CGColor; myLayer.delegate = self; // 1.1手动调用CALayer中的SETNEEDDISPLAY方法绘制图片 [myLayer setNeedsDisplay]; // 2.将自定义Layer添加到控制器的view的layer上 [self.view.layer addSublayer:myLayer]; } // 通过代理自定义layer - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { // 1.绘制图形 CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 50, 100)); CGContextSetRGBFillColor(ctx, 1, 0, 0, 1); // 1.渲染图形 CGContextFillPath(ctx); } - (void)test { // 1.创建自定义Layer NJLayer *myLayer = [NJLayer layer]; myLayer.bounds = CGRectMake(0, 0, 100, 100); myLayer.anchorPoint = CGPointZero; myLayer.backgroundColor = [UIColor greenColor].CGColor; // myLayer.position = CGPointMake(200, 200); // 1.1手动调用CALayer中的SETNEEDDISPLAY方法绘制图片 [myLayer setNeedsDisplay]; // 2.将自定义Layer添加到控制器的view的layer上 [self.view.layer addSublayer:myLayer]; } @end
--------
有道词典安装
---------
ios7 human interface guidelines (ui设计细节)
马上开始应用程序(简单看看 从苹果角度考虑)
View Controller Programming Guide for iOS: About View Controller (理解ios整个体系结构 很好 任何时候看都会有收获)
ios7 design resources 里面有iOS7 UITransition Guide 这里可以看到ios6过渡到7的新东西
-------------
/* 过渡效果
fade //交叉淡化过渡(不支持过渡方向) kCATransitionFade
push //新视图把旧视图推出去
kCATransitionPush
moveIn //新视图移到旧视图上面
kCATransitionMoveIn
reveal //将旧视图移开,显示下面的新视图
kCATransitionReveal
cube //立方体翻滚效果
oglFlip //上下左右翻转效果
suckEffect //收缩效果,如一块布被抽走(不支持过渡方向)
rippleEffect //滴水效果(不支持过渡方向)
pageCurl //向上翻页效果
pageUnCurl //向下翻页效果
cameraIrisHollowOpen //相机镜头打开效果(不支持过渡方向)
cameraIrisHollowClose //相机镜头关上效果(不支持过渡方向)
*/
--------------
要568高度的启动图片如果少了 可能导致界面直接采用480高度的启动图片 并且UIView也变小了 所以启动图片要设置好 可以改json
------
公司中一般用的最多的是每个人开发一个模块 或者某个人专门搭建storyboard搭建界面 其他人实现具体展示
------
修改系统级别的操作 (如:修改info.plist icon图片勾选 is pre-rendered等) , 需要删除原来的应(防止缓存) product->clean
-------
deployment target一般看市场的主要采用的那种系统 现在是7.1系统 所以这里选7.1
后期需要适配6.1再开始适配
-----------
有的公司安装模块来划分文件夹 先show in finder 在里面创建好目录 再把目录拖进来
----------
系统适配 和 xcode版本适配(方便别人的xcode4也能运行我的代码 因为别人的xcode4里没有定义 __IPHONE_7_0 )
打印当前系统版本号 是6.1还是7.1系统
默认系统向下兼容了
系统的适配判断系统的版本,低系统里没有提供7系统增加的方法 要用别的方法处理问题了
和编译器(xcode4)的适配 因为xcode4没有boundingRectWith方法
编译器的适配是采用#ifdef*** #else*** #endif
__IPHONE_7_0这个宏定义定义在编译器(xcode5以后)配备的头文件 <Availability/Availability.h>中
而xcode4中的<Availability>中没有定义宏 __IPHONE_7_0
pch文件里
#define iOS7 ([[UIDevice currentDevice].systemVersion doubleValue] >= 7.0)
-----------
deprecated 解释
不推荐使用的方法 但是可以使用
在ios5和7之间可以使用的
--------------------------
程序可运行的最低版本要求(代表可以在6.0 6.1 7.1 8.0都可以运行 系统都会向下兼容了)
这里的7.1表示用户的手机系统是ios7.1的系统 所以当然可以运行(可以运行的最低版本要求)
xcode可以拿到的api版本(8.4系统支持的所有代码)
-------
ios6 的界面高度(都不是全屏的 且tabBar Controller navigationController veiw的高度依次变小 ios7的所有高度都是全屏化的)
ios6
导航控制器的view宽高 离上面有一段距离 因为默认勾选了 导致这个v变高了(self.edgesForExtendedLayout = TOP向上拉伸 )
而ios6没有这个self.edgesForExtendedLayout方法 所以ios6的view不能网上提高高度 就导致了界面显示后不统一 要想统一 就应该取消勾选 取消auto layout
在ios7系统 tableView scrollView里面有穿透效果 使用默认的 并通过代码来判断当前系统 来调整代码做适配
----------
tabview静态单元格实际开发中很少用到
因为ios6系统显示界面不一样 另外操作不方便
----------
提示用户更新版本流程
------
retina数值为2 和非retina屏幕的数值1
设置frame CGAffineTransForm 动画取消这个view的autoLayout
-------
多敲 set会看到许多设置属性的东西
-----
快速注释
#if(0)
#endif;
-----------
夸框之间数据类型转换
Fundation OC的
Core Fundation C语言的 可以互相转换
夸框架转换需要__bridge 自动转换 xcode有自动提示
----------
C语言基本数据类型创建 需要手动释放
----------
-----------
Storyboard中button注意点:
storyboard中的button要改为custom
---------
storyboard中xib注意点:
1、xib中不要放手势识别器
手势识别器不要放在xib中 可能引起问题 因为手势识别器被当做xib中的一个对象了
2、新建view 创建xib指定类为view 注意xib名称不要和其他控制器很像 否则会被其他控制器加载了
3、修改xib名称后 需要clean 卸载应用
-------
tableViewController有了 navigationItem和 tabBarItem的时候
title属性的设置技巧
----------------
自定义UINavigationController注意点 HMUITabBarController
1、HMUITabBarController 添加子控制器方法里包装一个navigationController 并设置子控制器的navigationItem.title tabBarItem.title属性(用title可以代替2个)
2、test1.hidesBottomBarWhenPushed = YES
----------
自定义Button注意事项
自定义button 重写setHightLight方法 方式系统 在点击没放开的时候设置高亮效果
button没有size属性 写一个分类 加一个size属性 里面接收其他空间的size 设置button的frame
---------------------
分类的注意点:
给UIView写分类 让所有UI控件都有一个方法 v.x = 10;
分类只能扩充犯法 所以不能生成 _属性 只有方法的声明和实现
pch里 #import "UIView+Extension.h"
-----------------
自定义控制器注意事项
自定义UITableViewController UIViewController 不能继承 UIViewController
因为控制器类型不一样了 以后控制器就不要使用继承了
解决方法自定义导航控制器 重写push方法 在push方法里 将目标控制器设置一些基本的方法
-------------------
常见报错:因为导入了.m文件 或者 项目里有2个.m文件
------------
+(void)load类加载的时候调用
+(void)initialize 当类第一次干活时调用
--------
单例模式
单例对象 static id _instance; 定义在全局变量里
所以永远存在项目
一般用于共享同一份资源
对象要实现 [obj copy] 需要实现 <NSCopint>协议 可以不用写<NSCoping> 因为这个只是方便敲出代码用的 如果定义全局变量 id _musicTool; 其他类里面也可以随意访问 extern id _musicTool; 应该 static id _musicTool 这样就只允许 MusicTool类对 _musicTool变量进行访问
ARC下的单例
懒汉式:
// HMMusicTool.m // 03-单例模式-Singleton(掌握) #import "HMMusicTool.h" @implementation HMMusicTool static id _instance; /** * alloc方法内部会调用这个方法 */ + (id)allocWithZone:(struct _NSZone *)zone { if (_instance == nil) { // 防止频繁加锁 @synchronized(self) { if (_instance == nil) { // 防止创建多次 _instance = [super allocWithZone:zone]; } } } return _instance; } + (instancetype)sharedMusicTool { if (_instance == nil) { // 防止频繁加锁 @synchronized(self) { if (_instance == nil) { // 防止创建多次 _instance = [[self alloc] init]; } } } return _instance; } - (id)copyWithZone:(NSZone *)zone { return _instance; } @end
饿汉式:(了解即可 一般不用)
// HMSoundTool.m // 03-单例模式-Singleton // 饿汉式 #import "HMSoundTool.h" @implementation HMSoundTool static id _instance; /** * 当类加载到OC运行时环境中(内存),就会调用一次(一个类只会加载1次) */ + (void)load { _instance = [[self alloc] init]; } + (id)allocWithZone:(struct _NSZone *)zone { if (_instance == nil) { // 防止创建多次 _instance = [super allocWithZone:zone]; } return _instance; } + (instancetype)sharedSoundTool { return _instance; } - (id)copyWithZone:(NSZone *)zone { return _instance; } ///** // * 当第一次使用这个类的时候才会调用 // */ //+ (void)initialize //{ // NSLog(@"HMSoundTool---initialize"); //} @end
--
非ARC下的单例 为了阻止别人 release retain 等
------------------------------
工作时候微云找到单例工具 用宏+dispatch_once方式写的单例
dispatch_once是加锁的 安全的 更简洁高效
----------------
\ 代表后面一行是我的注意后面一行一定要有东西 用于不会变化的代码抽取到宏里 如单例
#define HMSingletonH(name) + (instancetype)share##name;
#define HMSingletonM(name) \
-----------
ARC转非ARC方式
---------------
推荐使用三方框架 最好用稳定的 开发进度最重要
--------
ARC 非MRC 判断
#if __has_feature(objc_arc)
//arc环境
#else
//mrc环境 manual [p release]
#endif
-----------------
网络
NSURLConnection可发 sendAsync异步线程发送请求 回到某个线程:queue 做什么操作 用于小文件下载 因为大文件用户可能断网
[NSURLConnection connectionWithRequest:request delegate:self];自动异步 。 比sendAsync sync好 因为可以监听整个下载请求过程
------------------
[obj description] 任何oc对象转为字符串 如@(123)
----
libz文件压缩解压缩都要用到 libz
-------
模拟器不能拍照 但是能选择照片 都是用的同一个方法 如果选择不允许 进入设置-》隐私-》相机-》
--
modal出新控制器 当前的控制器view就会从window上暂时被移走 最好用这种方式保证self.veiw不被移走
-------
文件直接拖到xcode里就变成了路径了
-----

浙公网安备 33010602011771号