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
自定义Layer

--------

有道词典安装

---------

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
View Code

 

饿汉式:(了解即可 一般不用)

//  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
View Code

--

非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里就变成了路径了

-----

posted @ 2016-03-07 16:32  海龙王来了  阅读(156)  评论(0)    收藏  举报
友情链接:废钢破碎机  带式压滤机