iOS开发基础----OC/UI控件



1. 前缀—> 只是代码组合之后,用来区分谁写的代码


2. 工具包frameworks 总共4个工具包,前3个是经常用的,最后一个是测试用的。


3. iphone 6 的SDK 是建立在 ios 8.0以上的


4.ios的界面虽然发生了改变,但还是从main.m中执行的,只是main.m没有放在导航区,而是放在Supporting Files 分组中。注意不是文件夹,是分组。


   main.m里有这个

return UIApplicationMain(argc, argv, nil, NSStringFromClass([ZYAppDelegate class]));

    main开始执行,但是会指引应用程序从一个类名为ZYAppDelegate 的类开始执行。


6.@property  属性描述,是为了将来打点调用


@property(性质)属性一旦被@property描述过后,他就相当于声明了一套完整的set get方法。同时也相当于声明了一个全局的属性(变量)

@property放在属性之后,比如 @property  int   age =  setAge +  getAge 这两个方法的声明;

   @synthesize(合成,综合)相当于把@property描述过的属性方法实现了一下,比如 @synthesize  age  = setAge + getAge  这两个方法的实现。

这两个是配套使用的,缺一不可。如果在 .m 中缺少@synthesize,可以在属性名前面加“_”或者“  self.    ”


   在定义全局变量的时候,在“{  }”中没有定义变量名,而在后面直接用@property 定义属性,这样系统在.m中会自动的在变量名前加“_”。所以全局变量都要以“_”开头。

@synthesize age =  _age 中的 = 号没有实际意义,_age 只是方法内操作的属性。


代码规范:属性(之前记得是全局变量,改一下说法) 以下划线 开头。

属性的描述可以简化成一行,最好按照一行的方式来写

属性的描述只是声明对应属性的set和get方法,不一定方法名和属性名相同,但是方法中操作的还是属性变量。


7.  

<UIApplicationDelegate>实现协议

UIApplicationDelegate 协议名


还有一种   retain  ????

(strong, nonatomic) 属性的描述里面加的 修饰,

nonatomic(非原子性)  主要是为了(线程 安全) ,线程主要是程序的执行。软件有多个线程,执行某一个任务可以有多个线程,在访问某个东西(比如元素的属性)的时候,为了属性的安全,一个线程一个线程的访问。有点类似 提款机,一个人操作某一项的时候,其他人不能再操作,会出现问题,不能同时操作。


10.创建一个window 对象,并且初始化 它的坐标和大小,大小是当前屏幕的大小


11.ZYAppDelegate   叫“入口类”

入口方法

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

//  应用程序已经完成启动,此方法会自动调用 


应用程序的方法,只在某些情况下会调用。(比如在里面各加一句话,就可以在控制台看到方法调用情况)

 //应用程序将要失去激活状态

- (void)applicationWillResignActive:(UIApplication *)application


//  应用程序已经进入背景(后台)

- (void)applicationDidEnterBackground:(UIApplication *)application


//  应用程序将要进入前台(就是打开应用程序的过程)

- (void)applicationWillEnterForeground:(UIApplication *)application


//  应用程序已经成为激活状态

- (void)applicationDidBecomeActive:(UIApplication *)application


//  应用程序将要终结

- (void)applicationWillTerminate:(UIApplication *)application


12.  iphone没有“退出”键


13. CoreGraphics 核心绘图,缩写为CG


14. NO variable 是ARC 的原因


15.

子类的对象可以赋给父类的指针


People * m = [[ Man alloc ] init ];     编译警告,运行没错


Man * m = [[ People alloc ] init ];   编译警告,运行错误


第一个, m只是一个指针,指向一个地址,分配的是子类的对象

第二个,m也是一个指针,分配的是 父类的对象,假如调用一个子类的方法,就会出错。

例子:

[self.window addSubview: label]  ,其实这就是把子类对象( label )赋给父类(UIView *)。


17. UIViewController 继承于 UIResponder 



—————————————————————————————————————————————————

18、9大基本数据类型


    //    Byte:字节类型   ,1字节  

    //    BOOL:布尔型 (YES ,1;NO ,0) ,1字节    

    //    char:字符型  1字节

   

    //    short:短整型 ,2字节                %d

    //    int:整型 ,4字节                         %d

    //    long:长整型,4字节(32位机,4字节;64位机 8字节)   %d

    //    long long:长长整型 ,8字节          

    //    float :单精度浮点型,4字节           %f

    //    double :双精度浮点型,8字节        

             

//   1 Byte  无符号 (正数) 范围 0 ~ 255 (2^8 -1)

//           有符号(存在负数)  -127 ~ 128

    

//    0000 0000     0

//    1111 1111     255

    

//    int   4个字节 4 * 8 =32bit

//    0 ~ 2^32 - 1

%c 一个单一的字符  

%d 一个十进制整数   

%i一个整数 

%e, %f, %g 一个浮点数

%o 一个八进制数   

%s 一个字符串   

%x 一个十六进制数             

%p 一个指针 

%n 一个等于读取字符数量的整数    

%u 一个无符号整数   

%[] 一个字符集                 

%% 一个精度符号


     对象类型     %@              内存地址  %p   


19、布尔型的用 BOOL 来定义。


20、方法名命名规则:首字母小写,后面的每个单词首字母大写。

工程命名规则:首字母大写,后面的每个单词首字母都大写。                       


21、(-)号方法,也叫实例方法,由类的对象去调用,(+)号方法,也叫类方法,由类去调用。


22、多参数方法的定义:-(void)方法名:(参数类型)参数名称  第二个参数的别名:(参数类型)参数名称;


23、.h:header 头文件,声明属性、方法  

.m:main 主文件,方法的实现

 


24、单行注释的快捷键Win+/,多行注释/* */


25、@end 为类声明结束的关键字


26、@interface Student : NSObject  ,student为NSObject 的子类


27、使用一个类,必须先导入头文件


28、打点调用和[ ]方法调用

zhangSan.age = 18 ;

[zhangSan setAge:18];


30、调用父类中的初始化方法           self = [super init];


31、子类里面 不能再声明和父类一样的属性,可以声明和父类同名的方法

/*继承:

1)子类可以继承父类所有的属性、方法(父类有的,子类都有);

2)子类可以重写父类的方法; 

3)子类可以扩充自己特有的属性、方法;

 */


32、

ipad1,2 : 1024 * 768   9.7寸

ipad3 ,4 : 2048 * 1536

ipad mini :1024 * 768    7.9寸

ipad mini :(retina)2048 * 1536

ipad air (ipad 5) :2048 * 1536   9.7寸

ipad air 2  2048 * 1536   9.7寸

模拟器: 1024*768


iphone                                                   模拟器尺寸(编程)                 真机分辨率:


simulator                           device    

iPhone 4 4s(3.5 inch)                             320*480 points                           640*960 px

iPhone 5 5s 5c(4 inch)                     320*568       640*1136

iPhone    6   4.7inch   375*667         750*1334

iPhone    6 plus   5.5inch   540*960         1080*1920                                           


34、双击获得一个目标,三击获得整行目标


—————————————————————————————————————————————————


35、UIlabel :UIView

UILabel * 标签名= [[UILabel alloc]init]; 

标签名.frame = CGRectMake(x,y,宽,高);

//  UILabel * 标签名 =[[UILabel alloc]initWithFrame : CGRectMake(x,y,宽,高)];

标签名.text = @“标签名称”;

标签名.font = [UIfont  systemFontOfSize:字体号];

      标签名.textcolor = [UIcolor 颜色];

标签名.backgroundColor = [UIcolor 颜色];

标签名.shadowColor = [UIColor  颜色] ;      // 设置阴影颜色

标签名.shadowOffset = CGSizeMake(1,1) ;   // 设置阴影的偏移量

标签名.textAlignment = NSTextAlignmentCenter;(默认为左对齐)

标签名.numberOfLines = 0;  默认一行,0表示无数行,只有设置了行数,才可以换行。


    [self.window addSubview:标签名];


字符串1 = [字符串2  stringByAppendingString : 字符串3] ;//给字符串添加一个字符串


36、UIImageView:UIView

UIImageView * 图片框名 = [[UIImageView alloc]init];

图片框名.frame = CGRectMake(x,y,宽,高);

图片框名.image = [UIImage imageNamed:@“图片名称.png”];

[self.window addSubview:图片框名];


37、UITextField:UIControl:UIView

UITextField * 文本框名 = [[UITextField alloc]init];

文本框名.frame =CGRectMake (x,y,宽,高);

文本框名.borderStyle = UITextBorderStyleRoundRect;  //RoundedRect  圆角矩形

文本框名.placeholder = @“提示信息”;

//  提示   默认设置之后 显示的是浅灰色(70%灰色),当输入内容时,自动消失。

文本框名.secureTextEntry = YES ;      //安全的文本输入,用于输入密码

//设置键盘类型   

文本框名.keyboardType = UIKeyboardTypeNumberPad(键盘类型);

//给textfield绑定一个事件

[文本框名  addTarget:self action:@selector(keyboardDown)forControlEvents:UIControlEventEditingDidEndOnExit];

//  UIControlEventEditingDidEndOnExit

  //  在文本框中,点击键盘上的return 键,结束文本框的编辑,这样键盘会自动的下去。

[self.window addSubView:文本框名];


38、UIbutton:UIControl:UIView

UIButton * 按钮名 = [[UIButton alloc]init] ;默认按钮的类型为Custom,而且只能是Custom//不建议用这种方式创建UIButton,也不一定

按钮名.frame = CGRectMake(x,y,宽,高);

按钮名 .background = [UIColor 颜色];

[按钮名  setTitle:@“状态名称1”forState: UIControlStateNormal];

[按钮名 setTitle:@“状态名称2”forState: UIControlStateHighlighted];

[按钮名  setImage:@“图片1”forState: UIControlStateNormal];

[按钮名 setImage:@“图片2”forState: UIControlStateHighlighted];

[按钮名  setBackgroundImage:[UIImage imageNamed:@“图片名 称.png”]forState: UIControlStateNormal]; 

[按钮名 addTarget :(代理对象,一般为self) action : @selector(方法名)forControlEvents:(UIControlEventTouchUpInside)] ;

[self.window addSubview :按钮名];  

//  addTarget 是UIControl的方法

//  UIImage  图片类  UIImage : NSObject


//  @property(nonatomic,readonly) UIButtonType buttonType;

//  readonly 只读  只有get方法,没有set方法

//  +buttonWithType: 创建按钮对象,并且指定类型

  

//  UIButtonTypeSystem

//  standard system type 标准的系统类型

//  iOS 7.0之前 拟物化 RoundedRect

//  从iOS 7.0之后 弃用 RoundedRect 用system代替。

//  设置按钮在不同状态下的标题 标题的颜色默认是白色



39、button的另一种形式(这种形式创建的按钮)

UIButton * 按钮名 =[UIButton buttonWithType: UIButtonTypeRoundedRect或UIButtonTypeSystem];

//按钮名.buttonType = UIButtonTypeContactAdd;   这个句子有错误,buttonType为只读属性,不能赋值


40、键盘下去的

1⃣️ [self.window endEditing :YES];

2⃣️[ 文本框名  resignFirstResponder];

让文本框失去第一响应者,对于文本框来说,第一响应是键盘上来,失去第一响应,即让键盘下去

对应的是 becomeFirstResponder  ,这两个方法是 UIResponder  的方法 。同时UIView也继承于UIResponder



41、触屏的四种方式

-(void)touchesBegan:(NSSet *)touches withEvent : (UIEvent *) event

{

NSlog(@“触屏开始了”);

}

-(void) touchesEnded : (NSSet * )touches withEvent : (UIEvent * ) event

{

NSlog(@“触屏结束了”);

}

-(void) touchesMoved : (NSSet * )touches withEvent : (UIEvent * ) event

{

NSlog(@“触屏移动了”); 

}

-(void) touchesCanelled : (NSSet * )touches withEvent : (UIEvent * ) event

{

NSlog(@“触屏取消了”);

}


42、产生随机数

arc4random();   unsigned int 无符号整形


43、让window可见

[self.window makeKeyAndVisible];


45、

获得输入框中的内容    NSString * 字符串名 = 输入框名.text;

把字符串转换成整数    Int 整数名 = [字符串名   intValue];


———————————————————————————————

46、判断字符串是否相等

isEqualToString


47、警示框 UIAlertView

UIAlertView * 警示框名 = [[UIAlertView alloc] initWithTitle:@“标题” message: @“警示信息”delegate: 代理对象(一般为self) cancelButtonTitle:@“取消”

otherButtonTitles:@“确定”,…,nil

[alert show];


48、从父视图中移除视图     [视图名   removeFromSuperview]


49、UIView的动画     (帧动画),动画只是一种过渡效果


   //开启动画

    [UIView beginAnimations:nil context:nil];

    //动画的持续时间

    [UIView setAnimationDuration:2];

    //动画的代理方法

    [UIView setAnimationDelegate:self];

    //动画内容

    view.frame = CGRectMake(280, 400, 40, 60);

    //alpha 透明度  0-1

    view.alpha = 0.8;

    NSLog(@"没有真结束");

    //动画停止(只有调用动画停止方法,动画才真正停止)

    [UIView setAnimationDidStopSelector:@selector(jieshu)];

    //提交动画

    [UIView commitAnimations];


[UIView beginAnimations:nil  context: nil  ];

[UIView setAnimationDuration:时间];

[UIView setAnimationDelegate:self ];

// 设置动画翻转样式

[UIView  setAnimationTransition :UIViewAnimationTransitionFlipFromLeft    forView:( 针对那个视图,一般为self.window )cache:(缓存YES /NO)];

// 如果cache设置成NO,则对于执行动画的转换过程中,会对每一帧图片进行更新,而且这种更新可能会明显的影响帧的速率。例如uiview上的按钮会慢慢显示出来,而不是一下子就显示出来

//设置动画运动方式   

[UIView setAnimationCurve : UIViewAnimationCurveEaseOut ] ; 

    // (UIViewAnimationCurve)curve      弯曲   Ease 缓慢 舒缓

    // UIViewAnimationCurveEaseInOut,   在开始和结束的时候运动慢 // slow at beginning and end

    //    UIViewAnimationCurveEaseIn,  在开始的时候运动慢 // slow at beginning

    //    UIViewAnimationCurveEaseOut,  在结束的时候运动慢  // slow at end

    //    UIViewAnimationCurveLinear,   Linear 直线  匀速运动


[UIView setAnimationDidStopSelector:@selector(方法名)];

//动画自动转向 

[UIView setAnimationReapetAuthoreverses : YES/NO ];

[UIView commitAnimations];


注:动画代理方法和停止是配套的,开启动画和提交动画是配套的


//动画延时方法

[self  performSelector:@selector(方法名)  withObject:( id ) afterDelay: ( NSTimeInterval ) ];


2.另一种创建数组图片动画的方式

对象名.animationImages = [[NSArray alloc]initWithObjects : [UIImage imageNamed:@“图片1”],[UIImage imageNamed:@“图片2”],nil ] ;  //这种数组里只能包含图片对象

对象名.animationDuration = 间隔时间;

对象名.animationRepeatCount = “循环次数,0代表无限循环”;

[对象名  startAnimation] ;

//  [对象名  stopAnimation]  ;


50、alpha 透明度   0 -1


51、定时器 NSTimer

[NSTimer scheduledTimerWithTimeInterval:(间隔时间) target:(目标,一般为self) selector :@selector(方法名) userInfo :(用户信息,一般为nil) repeater:(YES/NO)];//NO只会执行一次

//调用fire方法会让timer立即执行,不会等待第一次的间隔时间 

[定时器名 fire] ;   // 这句话是让执行到定时器的时候,立即开启定时器

//让定时器暂停  [定时器名  setFireDate:[NSDate distantFuture]];

//让定时器开始  [定时器名  setFireDate:[NSDate distantPast]];

//让定时器停止   [定时器名 invalidate];


52、数组(可变、不可变)

        不可变数组(NSArray):当你初始化的必须要给它指定里面的元素,而且不能删除里面的元素,也不能创建完成之后再向里面添加新的元素,跟它对应的是可变数组(NSMutableArray)


不可变数组 NSArray,initwithobjects用多个对象初始化数组

NSArray * 数组名 = [[NSArray alloc]initWithObjects :@“数组成员1”,@“数组成员2”,nil ];

NSLog(@“%@”,数组名);   //  取所有数组成员

/*取某一个对象

NSString * 字符串名 = [数组名 objectAtIndex : 数组索引值] ;

NSLog(@“%@”,字符串名);


可变数组 NSMutableArray 

NSMutableArray * 数组名 = [[NSMutableArray alloc]initWithCapacity : 数组容量,可设置为0,随着数组容量的增加而增加。

[数组名 addObject: 对象名];

//在某一个位置添加对象

[数组名 insertObject :对象名 atIndex: 索引值];

//移除数组中的某一个对象

[数组名 removeObject :对象名];

//返回数组中元素的个数

[数组名 count];



53、拼接字符串的方法 stringWithFormat

NSString * 变量1 = [NSString stringWithFormat : @“图片名 %d ”, i  ] ;

UIImage * 变量2 = [UIImage imageNamed : 变量1] ;

将上面的两行合并起来

UIImage * 变量2 = [UIImage iamgeNamed:[NSString stringWithFormat:@“图片名 %d”, i  ]] ; 

[数组名  addObject : 变量2 ] ;



54、泛型遍历数组

for (NSObject * object  in  数组名)                                                                                                                                   

{

语句1;

}


55、(NSSet *)中的NSSet 是一个集合, touches 屏幕中点的集合


56、tag值,UIView固有的属性,默认为0, 最好不要设置为 0 


57、bounds 是以自身为参照坐标,自身的左上角为(0,0)


————————————————————————————————————

58、获取按钮的tag值,并创建一个指针按钮来指向它

UIButton * 按钮名 = (UIButton *)[self.window  viewWithTag : tag值] ;  



59、猜数字游戏:两个按钮绑定同一个方法,有2种方式实现区分按钮操作,(设置静态变量static  i)(设置tag值)

————————————————————————————————————————————

60、self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    //当前类有一个window属性

    //window:窗口(视图)UIWindow  父类是UIView

    //创建一个UIWindow类型的对象 ;

    //初始化的时候,有一个参数 frame

    //frame :window的大小和位置;

    //[UIScreen mainScreen]:获得手机的主屏幕  screen:屏幕

    //bounds:大小 ;boundary:边界

//    [[UIScreen mainScreen] bounds]

    

    //创建一个window,大小为当前屏幕的大小


61、

/*

 struct:结构体          

 

rect(x,y,width,height)     point:坐标点(x,y)       size:大小(width,height)  


 struct CGRect 

 {

    CGPoint origin;

    CGSize size;

 };


 struct CGPoint 

 {

     CGFloat x;  float  x坐标

     CGFloat y;   y坐标

 };

 

 struct CGSize 

 {

     CGFloat width;  //宽

     CGFloat height;  //高

 };

 */


64、设置图片 UIImage iOS设备上图片的默认类型为png,所以当图片的名称后缀为png时,可以不写;


55、Button,   当setImage 和setTitle同时存在时,如果图片把button填充完整,那么就不显示标题;setTitle 和 setBackgroundImage  标题和背景图片可以共存


66、label默认字号大小为17号


67、[button addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside];

//点击button的时候,要有对应的触发事件;

    //当点击button的时候,buttonClick方法被调用执行一遍 ;

    //第一个参数:指明当点击button时,由谁去执行对应的触发事件

    //第二个参数:指明当点击button时,触发的事件(方法)的名称; @selector(方法名称)

    //第三个参数:指明什么情况下,去调用方法;

    //谁在什么情况下,调用哪个方法;

    //self:当前类的对象;让当前类的对象去调用buttonClick方法;

    //UIControlEventTouchUpInside:点击button然后松开的时候调用方法;forControlEvents:控件类型


68、方法体在哪个类的.m文件中写,方法就是哪个类的方法


70、Company identifier 公司标识符,一般用反域名,比如com.baidu


———————————————————

1、-(id)initWithAge:(int)aAge

{

    //self:自己   当前类中调用这个方法的对象;

    //super:父类

//    [super init] ;调用父类中的初始化方法;

    //NSNumber  类簇:类的集合

    self = [super init]; //完成父类的初始化操作

    //如果self不为空

    if (self)   // 如果父类初始化成功,则。。。进行子类的初始化操作

    {

        //个性化的操作

        age = aAge ;

    }

    //最终 返回 self ;

    return self ;// 返回类型是ID类型,所以这里是self

}


————————————————————————————————————————————

73、unrecognized selector sent to instance 这个对象调用了一个没有的方法


75、 另一种创建UIImage的方法

  //只要告诉图片的名字,会自动帮你找到图片的路径并加载他。

    //使用这种方式加载图片系统会自动的缓存图片,下次再加载相同名字的图片的时候,就不会从硬盘读取,而是直接读取缓存,速度更快。但是坏处是图片会一直缓存着,占用内存空间

    //UIImage *image = [UIImage imageNamed:@"flake.png"];

    //bundle 捆,束。bundle 代表我们的工程    路径

    //通过图片的名字查找项目中文件的路径

    //第一个参数:图片的名字。第二个参数:图片的扩展名

        UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(x,y,w,h)];

    NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"flake" ofType:@"png"];

    //这种方式创建的图片,不会再内存中缓存,用完之后就被释放掉了。所以如果要加载很大的图片,并且这个图片只是使用一段时间,可以通过这种方式加载。如果通过imageNamed方式加载,即使图片不用了,也会一直缓存在内存中。

    //通过指定图片的路径来创建一个UIImage对象

    UIImage *image = [[UIImage alloc] initWithContentsOfFile:imagePath];

    imageView.image = image;

    [self.view addSubview:imageView];


76、void * 代表任意的对象类型,等价于id类型


77、(UIImageview *)强制类型转换,因为头文件是(void *)类型的

    UIImageView * imageView = (__bridge UIImageView * )context;


79、// %d 是整数的占位符, %02d 表示整数是两位

  // %.02f 代表小数点后两位,默认保留6位小数


——————————————————————————————————————————————————

80、打飞机(触碰飞机移动)

 

//触碰飞机让飞机移动

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

    //NSSet  类似于数组  touches屏幕中点的集合

    UITouch *变量名1 = [touches anyObject];

    //locationInView 获取屏幕中我们所触发的那个点

    CGPoint 中心点1 = [变量名1 locationInView:self.window];

    //CGRectContainsPoint 判断所触发的那个点是否在飞机的内部

    if (CGRectContainsPoint(myPlane.frame, 中心点1 ))

    {

        myPlane.center = 中心点1 ;

    }

}


81、会动的火焰(向数组中添加图片对象)

   imagesArray = [[NSMutableArray alloc] init];

    //数组当中加了17个UIImage对象

    for (int i = 1 ; i <= 17; i++)

    {

        // %d 是整数的占位符, %02d 表示整数是两位

        // %.02f 代表小数点后两位,默认保留6位小数

        NSString *imageName = [NSString stringWithFormat:@"campFire%02d.gif",i];

        UIImage *image = [UIImage imageNamed:imageName];

        [imagesArray addObject:image];

    }


82、 静态(static)变量,全局变量,const变量区别:


static 静态变量,即不在堆上,也不在栈上,静态变量是系统在编译期就直接给它赋值的,所以当程序执行静态变量所属的方法的时候,也就不会再执行这行代码了。静态变量的赋值只会在编译器执行一次,且不能赋值一个不确定的值。static关键字会在声明变量时分配内存,在程序运行期间只分配一次内存,之后再访问时实际都是在访问原先的内存,适合于不常改变的局部变量。

全局变量也是只分配一次内存,并在整个程序运行期间保持不变。

const    变量是只读的,即第一次初始化后他的值将不能改变,通常用来声明常量。


83、宏定义#define

特点:全大写,单词之间用下划线

好处:把无意义的数字用字符串代替,修改一个地方即可修改所有地方;

一个良好的编程习惯是定义宏定义的时候,最外面加上括号


84、让定时器失效

[定时器名  invalidate] ;


85、参数传递    context:上下文

    [UIView beginAnimations:nil context:(__bridge void *)(imageview2)];

    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];


-(void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context

{

//    (UIImageview *)强制类型转换,因为头部是(void * )context 类型的

    UIImageView * imageView = (__bridge UIImageView * )context;

    [imageView removeFromSuperview];

}


86、图片名称写的不正确的情况下,系统会提示错误,或者加载不出来图片,所以名称不好写的话,最好复制粘贴,图片的格式名也要写正确。

 NSString * 字符串名 =[NSString stringWithFormat:@“图片名 %d”,i ] ;(拼接类型转换)


87、在OC里,所有处理角度的值都用的是弧度。

      旋转的时候,负数是逆时针,正数是顺时针。


——————————————————————————————————————————————————

89、打地鼠

//让锤子旋转

    //设置旋转时   旋转中心默认的是 中心点

//锚点 anchorPoint是相对于bounds的比例值来确定的  (0,0)左上角  (1,1)右下角

    //锚点 anchorPoint  锚点设置为(0,0)的时候是以左上角为中心旋转的,锚点设置为(1,1) 是以右下角为中心旋转


      IOS使用左手坐标系,坐标原点在左上角,MacOS使用右手坐标系,原点在左下角 

  

    //如果设置了transform 属性,必须恢复transform属性

    //identity  特性

//CGAffineTransformIdentity 取消自身的所有变换

    hammerV.transform=CGAffineTransformIdentity;

    

    [UIView beginAnimations:nil context:nil ];

    [UIView setAnimationDuration:0.5];

    //旋转Affine  仿射     Rotation  旋转角度

    //在oc 里   所有处理角度的值都用的是弧度angle*M_PI /180

    //如果角度是整数   顺时针旋转  , 角度是负数    逆时针旋转

    hammerV.transform=CGAffineTransformMakeRotation(-90/180.0*M_PI);

    [UIView commitAnimations];


90、延时方法 

[self performSelector:@selector(方法名) withObject:对象 afterDelay:延时时间];


91、直接跳出整个方法(猜数字游戏)   return ;


92、 //UserInteractionEnabled  设置是否可交互;

    文本框名.UserInteractionEnabled =NO;


93、图片移至最下层

[self.window sentSubviewToBack:图片名 ] ;


94、    [文本框名 resignFirstResponder]; 让键盘下落


95、hidden 隐藏属性,逻辑类型


96、这个方法不符合要求(了解即可)

//让对象放大1.1~2倍的算法    1.0/(arc4random()%10+1)+1;


97、让雪花消失

-(void)remove

{

不能把雪花对象设置成全局变量  这样会导致找到的雪花对象不知道是哪个对象,而且会引起内存泄露;

    [imageView removeFromSuperview];

}


——————————————————————————————————————————————

98、#import 关键字 (在文件中导入工具,以便以后能够使用)

<> (尖括号代表的是系统的工具,即SDK中已有的。如果系统的工具满足不了要求,需要我们自己创建的工具在引用的时候使用“”(双引号),不再使用尖括号)

Foundation代表 Xcode左侧 Frameworks—》foundation.framework,即框架

“/”代表子文件夹

Foundation.h 中同时导入了Foundation.framework中其他所有的工具类,可以只导入Foundation.h即可实现将所有类 都导入使用。

@interface 作用:用来定义(声明)类

@interface (类名1): ( 类名1的父类 ) “ : ”是 继承的意思


99、//看似我用了一个指针来调取了一个方法,其实它在运行的时候,通过这个指针来找到我指向的对象,然后用对象来调方法。


102、 //隐藏信号栏   

// [UIApplication sharedApplication].statusBarHidden = YES;


103、定时器的参数传递 (传递的是一个对象,容易被绕晕) ???

    [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(go:) userInfo:diji repeats:YES]; 

-(void)go:(NSTimer  * )time

{       //注意这个是 “NSTimer * ”

    UIImageView* diji = (UIImageView* )time.userInfo;


105、在iOS模拟器上添加项目图标

在 .plist 添加一个添加一行 icon files,后面value 命名为 你要设置的图片名称加后缀,即可。


106、ARC(automatic reference  count) 内存半自动管理机制

—————————————————————————————————————————

107、super代表父类  对象,是一个对象,不是类


108、self.age = 18  与 age =18 的结果是一样的,只是第一种是先调用set方法,对age赋值,第二种是直接对属性赋值。


109、[  self  减号方法  ] self 在减号方法中使用,self 代表当前对象

      [  self  加号方法  ] self 在加号方法中使用,self 代表当前类


111、栈 (stack) 、堆(heap) ,变量一般放在这两个里面,但静态变量比较特殊,不在这两者里面,在全局数据区。


—————————————————————————————————————

112、用双重循环创建九宫格,按钮tag 设置:btn.tag = i * 3 + j

用单循环创建九宫格,按钮 tag 设置 : btn.tag = i+1 ;


113、图片名.userInteractionEnable=YES;


114、控件.transform = CGAffineTransformMakeRotation(角度/180*M_PI);


116、导航控制器(标记红色的为可能更改的地方

//创建导航控制器

UINavigationController  * 导航控制器名 = [[ UINavigationController  alloc] initWithRootViewController :viewController ];(viewController 是类名)


self.window.rootViewController = 导航控制器名; //这句话有点不太理解???


//导航条隐藏

导航控制器名.navigationBarHidden = YES ;


//设置视图控制器的标题,会自动居中显示在导航条上

self.viewController.title = @“标题”;


//跳转到某个新建的导航页

viewController * 新建类变量名称 = [[ viewController  alloc ] init]; (viewController  是类名)

[ self.navigationController  pushViewController : 新建类变量名称  animated : YES /NO ];

//跳回到根视图控制器

[ self.navigationController popToRootViewControllerAniamted:(BOOL) ];

// pop 到指定控制器

[ self.navigationController popToViewController : (UIViewController) animated: (BOOL)];

//self.navigationController.viewControllers可以返回当前导航控制器中的控制器们

//  哪来的回哪去

[self.navigationController popViewControllerAnimated:(BOOL)];


//导航控制器间的传值

NSArray * 数组名 = self.navigationController.viewControllers ;

取出控制器的索引值 [ 数组名  objectAtIndex : 索引值 ] ;


//在导航控制器的两边创建按钮

UIBarButtonItem  * 左边按钮 = [[  UIBarButtonItem  alloc] initWithTitle : @“左边按钮名”style:UIBarButtonItemStylePlain   target : self     action : @selector (左边按钮方法) ];

self.navigationItem.leftBarButtonItem = 左边按钮 ;

// navigationItem :导航项    leftBarButtonItem : 左栏按钮项


UIBarButtonItem * 右边按钮 = [[  UIBarButtonItem alloc] initWithTitle : @“右边按钮名”style: UIBarButtonItemStylePlain   target: self      action :@selector(右边按钮方法) ];

self.navigatioItem.rightBarButtonItem = 右边按钮 ;


//直接跳转到根视图控制器

[self.navigationController   popToRootViewControllerAnimated:<#(BOOL)#>] ;


→定义导航栏上左右按钮的几种形式(以右边按钮为例)

1⃣️系统自带的样式

// Custom 意思是自定义、、定义按钮为系统图表

UIButton * 按钮名 = [ UIButton  buttonTypeWithType : UIButtonTypeInfoLight ] ;

UIBarButtonItem * 右按钮名 = [[ UIBarButtonItem alloc]  initWithCustomView : 按钮名 ] ;

self.navigationItem.rightBarButtonItem =  右按钮名 ;


2⃣️用image定义按钮的形式

//定义按钮为图片  

UIBarButtonItem * 右按钮名 = [[  UIBarButtonItem alloc ] initWithImage:[UIImage  imageNamed:@“图片名”] style : 1     target :self  action:@selector (方法名) ];

self.navigationItem.rightBarButtonItem = 右按钮名 ;

3⃣️选项卡代替按钮

NSArray * 数组名 =[[  NSArray  alloc ] initWithObjects :[UIImage   imageNamed:@“图片名1”],[UIImage  imageNamed:@“图片名2”],nil ];

UISegmentedControl * 名称 2= [[  UISegmentedControl  alloc]initWithItems :数组名 ];

名称2.segmentedControlStyle = UISegmentedControlStyleBar ;


//设置选项卡按钮能弹起 ???

名称2.momentary =YES ; 

UIBarButtonItem  *  右按钮名 =[[  UIBarButtonItem  alloc] initWithCustomView : 名称2 ];

self.navigationItem.rightBarButtonItem = 右按钮名 ;

117、滚动条(UIScrollView)

UIScrollView *  滚动条名 = [ [ UIScrollView  alloc] init ];


滚动条名.delegate  = self ;  


滚动条名.center = CGPointMake(x,y);

滚动条名.bounds = CGRectMake ( 0,0,width,height ) ;

滚动条名.contentSize  = CGSizeMake (图片尺寸 * 图片数 , height ) ;

//分页

滚动条名.pagingEnabled = YES/NO ; 

//设置滚动条下面的指示器条是否可视

滚动条名.showsHorizontalScrollIndicator = YES/NO ;

[ self.view  addSubview:滚动条名 ];  


—————————————————————————————————


118、记得在.h里面声明类之后要在  .m里写类的实现


119、图片名或标签名.userInteractionEnable=YES;   设置可交互性--视图的层级关系--响应链 

——》设置可交互性,控件只有图片和标签没有交互性,所以在上添加的按钮不能被按下,除非交互性被设置为YES。

(若视图不可交互,则子视图一定不可交互;若父视图可交互,则子视图的交互性由子视图决定)


120、  #pragma mark ——   做标记,用于区分各个方法


121、导航控制器—》用到栈zhan结构:导航控制器只显示最上面的一个元素

导航栏只有一个,所有视图控制器公用。


122、代理的本质还是传值


125、  将多余的地方减掉

图片框.clipsToBounds = YES ;

图片框.layer.cornerRadius = 20 ;  设置圆角


————————————————————————————————————————————————

127、   ??????

/*模拟导航控制器是如何处理穿进去的视图控制器的


UINavigationController.m


- (id)initWithRootViewController:(UIViewController *)rootViewController

{

    if (self = [super init])

    {

        //导航控制器内部首先把传进来的rootViewController存到栈中。

        rootViewController.navigationController = self;

    }

    

    return self;

}

 */

———————————————————————————

    //创建一个导航控制器,并且把第一个视图控制器当做导航控制器的根视图控制器

    //UINavigationController 是一个容器viewcontroller(继承自UIViewController),因为他可以管理其他的多个viewcontroller。

    UINavigationController *navViewController = [[UINavigationController alloc] initWithRootViewController:firstViewController];

    //把导航控制器放在window上(这个地方可能会有改动,不一定是self.window )

    self.window.rootViewController = navViewController;


    //push 推,压 ,第一个参数:要压栈的viewcontroller,第二个参数:是否要动画

    //self 代表的是当前的viewcontroller

    //self.navigationController  代表的是当前viewcontroller所在的导航控制器

    [self.navigationController pushViewController:secondViewController animated:YES];

—————————————————————————————————————————————————

    //设置导航的标题

    self.navigationItem.title = @"aaa";



if (_rightCount == 4)

    {

        ZYMainViewController *main = [[ZYMainViewController alloc] init];

        

        //因为在main中需要push       所以在这里将导航加载这里    将main初始化为导航的根控制器

        

        UINavigationController *mainNav = [[UINavigationController alloc] initWithRootViewController:main];

        mainNav.navigationBarHidden = YES;  


       //找根控制器

        ZYAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]]; 

        

        [UIView beginAnimations:nil context:nil];

        [UIView setAnimationDuration:kAnimationDuration];

        [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:appDelegate.window cache:YES];

        [UIView commitAnimations];

        appDelegate.window.rootViewController = mainNav;

    }

————————————————————————————————————————————————


//Appear 出现 Will 将

//重写父类的方法。

//当控制器将要显示到屏幕上的会调用这个方法,而且会多次调用

- (void)viewWillAppear:(BOOL)animated


—————————————————————————————————————————————————

    /*

     返回按钮的优先级,优先级从高到低

     1.手动设置self.navigationItem.leftBarButtonItem

     2.使用第一个界面的标题

     3.如果第一个界面没有标题,默认为back

     */

—————————————————————————————————————————————

    //导航条是多个viewcontroller共有的

    //导航项是每个viewcontroller都有的属性

 —————————————————————————————————————————————

    //创建一个UIBarButtonItem

//    UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(goBack:)];

//    

//    //navigationItem 导航项(左按钮,右按钮,标题),设置导航条的左按钮

//    self.navigationItem.leftBarButtonItem = barButton;

————————————————————————————————————————————

    //另外一种创建UIBarButtonItem的方式

    //Custom 自定义视图

    // UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:<#(UIView *)#>]


//navigationBar是继承自uiview的,所以可以直接通过addsubview的方式添加,但是因为navigationBar是共有的,所以添加上的视图是所有界面都能看到的

    

//    UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(220, 0, 100, 44)];

//    aView.backgroundColor = [UIColor redColor];


//    [self.navigationController.navigationBar addSubview:aView];

   

//    self.navigationItem.leftBarButtonItem.title = @"1233";

————————————————————————————————————————————

//self.navigationController 通过导航控制器,调用viewControllers方法,这个方法的作用是返回导航控制器中所有的视图控制器

    NSArray *allViewController = [self.navigationController viewControllers];

    //找到第一个视图控制器的对象

    ZYFirstViewController *firstController = [allViewController objectAtIndex:0];


    //pop 弹出 ,出来

    [self.navigationController popViewControllerAnimated:YES];


128、  UIViewController * viewController = [[[UIViewController alloc]initWithNibName:@"ViewController" bundle:nil] autorelease];

//  懒加载  lazy load (只创建视图控制器对象,运行程序是不能显示view,但是执行下面代码,才会调用vc的viewDidLoad方法。)

    self.window.rootViewController = viewController;


129、不能深度赋值 

CGRect rect = imgView.frame

    rect.origin.y += 3;

    imgView.frame = rect;


130、userInfo:用户信息   target:目标  给哪个对象来设置


131、CGRect (待测试????)


CGRectMake(X,Y,W,H)用代码定义矩形


NSStringFromCGRect(someCGRect);把CGRect结构转变为格式化字符串


CGRectFromString(aString);由字符串表示恢复出矩形


CGRectInset(aRect);用来创建较小或较大的矩形(中心点相同),使用正的内嵌值表示较小的矩形,负的表示较大的矩形


CGRectIntersectsRect(rect1,rect2);判断矩形结构是否交叉,两个对象是否重叠


CGRectZero;高、宽为0,位于(0,0);需要创建边框但还不确定边框大小或位置时可以使用此常量。


132、非ARC下,下面代码有无警告和错误?并指出错误原因。


 Man,Woman是People的子类 

 People中的有方法: -(void)peopleMethod,

 Man类中有方法:   -(void)manMethod

 Woman类中有方法: -(void) womanMethod


  1 Woman *w = [Man alloc]; 警告  指针类型不匹配 

incompatible pointer type…

  2 [w womanMethod];运行崩溃 –[Man womanMethod] unrecognized selector sent to instance 0xxxxxx;

   

  3 People *p = [Man alloc]; 正确

  4 [p peopleMethod];编译正确,运行正确。


  5 Man *m = [People alloc];编译 警告  不匹配的指针类型

  6 [m peopleMethod];编译 执行 正确。


  7 NSString *p = [Man alloc];编译 警告 不匹配指针类型

  8 [p manMethod]; 编译警告,执行正确


133、universal通用的,executable 可执行的


136、UIView  作用:充当管理者

ViewHierarchy 视图层次关系


137//assign 九大基本数据类型

//copy  字符串

//retain 对象类型(比如数组)

//strong 基本不用,主要是系统的一些对象


138、//  总结:ios8 SDK 之前 lab上是可以添加lab并且能够显示的,但是ios8 SDK 之后 不行了。但是View上却可以添加子视图。


139、  hidden 隐藏 默认为NO


140、创建登陆注册页面,比较好的一种做法是在window 上同时创建两个视图,但是先添加一个登陆页面,在按钮中把注册页面self.view  addSubview,显示出来。


142、关于UIViewController 

UIViewController :UIResponder

我们用的都是UIViewController的子类,而且每个viewController都会默认存在一个view。


如果把viewController的对象赋给window的rootViewController,则会显示viewController中的view的内容。


在加载viewController的view时,首先从xib文件中加载,然后才去执行viewController中viewDidLoad方法。


143、viewDidLoad是重写方法(即自定义方法)


144//把独立的逻辑封装成方法,用self调用,减少入口方法的负担,便于管理


147、高清图@2x


148、  模态弹出     

[self presentViewController:shanken animated:YES completion:nil];

[self dismissViewControllerAnimated:YES completion:nil ];


150、最先讲的一种:

    SecViewController * VC = [[SecViewController alloc]init];

            获得应用程序的对象

    UIApplication * app=[UIApplication sharedApplication];

            根据应用程序的属性,得到入口类的对象

     AppDelegate * appdelegate =app.delegate;

            根据入口类的属性,得到当前窗口window

     UIWindow * window= appdelegate.window;


    [window  addSubview:VC.view];


第一种:(这种方式获得的是keyWindow,当出现键盘、警示框等的话,主window就会不是入口类的window)

     UIWindow*window=[UIApplication sharedApplication].keyWindow;


第二种:噢合度 (用这种创建方式最安全)

     UIWindow * window=[[UIApplication sharedApplication]delegate]window];

第三种:

     UIApplication * App=[UIApplication sharedApplication];

     NSArray * array=App.windows;

     UIWindow * window=[array objectAtIndex:0];


151、键盘是系统用window做的 


152、注意动画的 setAnimationTransition:UIViewAnimationTransitionCurlUp ,这个是有视图限制的,不能放在入口方法中,因为入口方法只有一个视图,不能够翻转,但是加载延时方法之后,就可以实现翻转。


——————————————————————————————————————————————


154、 ????这个到底啥意思???

用single view application 创建的项目,里面默认是没有创建window 的,在第二个页面里添加一个文本框,和一个方法(touchbegin),文本框出来的时候点击空白地方,键盘不会下去????

—》解决办法:第二个页面默认是创建了view 的,但是没有在view中创建实体对象,也就是说点击空白地方就真的是空白,连背景都没有,看着是白色的,其实什么也没有,。。如果设置了背景颜色,再点击空白处键盘就可以下去了。


155、[self presentViewController:second animated:YES completion:nil];

这句话只是让second页面从下面出来,这句话只能放在相应的触发事件里面,如果在ViewDidLoad里,那么second页面是被加载了的,但是跳转不过去?!不知道为什么会加载second里的内容。


156、UIViewController 是视图控制器,UIView是视图,和有没有window没有任何关系。


157、init方法与类方法本质上是没有区别的,类方法里面有 autoRelease 方法,init方法alloc 需要调用release 方法。


158、   ????

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(autoScroll) userInfo:nil repeats:YES];

    ////通常在主线程中使用nstimer 出现滑动界面时,系统为了更好的处理UI时间和滚动显示 主线程run loop会暂时停止处理一些其他事件,这时主线程中运行的NSTimer会被暂停 。解决办法就是改变ranloop运行的mode  mode可以看成事件类型  不使用默认的  而是使用NSRunLoopCommonModes [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]默认类型即缺省类型为NSDefaultRunLoopMode

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];



159、内存管理黄金法则:

    The basic rule to apply is everything that increases the reference counter with alloc,[mutable]copy[WithZone:] or retain is in charge of the corresponding [auto]release.

如果一个对象使用了alloc,[mutable] copy,retain,那么你必须使用相应的release或autonrelease.

基本类型和C语言的类型:如:int,short,char,struct,enum,union等类型

OC类型:任何继承于NSObject对象都属于OC的类型。

我们讲的内存管理实际上是对OC类型的内存管理,它对基本数据类型和C语言的类型并不管用。

每一个OC对象都有一个4个字节的retainCount的计数器。表示当前对象被引用的计数。如果计数为0,那么就真正的去释放这个对象。


规则:

1、Objective-C类中实现了引用计数器,对象知道自己当前被引用的次数

2、最初对象的计数器为1

3、如果需要引用对象,可以给对象发送一个retain消息,这样对象的计数器就加1

4、当不需要引用对象了,可以给对象发送release消息,这样对象计数器就减1

5、当计数器减到0,自动调用对象的dealloc函数,对象就会释放内存

6、计数器为0的对象不能再使用release和其他方法



160、设计模型:MVC (model view controller)  ??

  


162、    // 判断字符串中是否包含另一个

    NSRange range = [@"abcd" rangeOfString:@"ab"];

    if (range.location != NSNotFound)

    {

        NSLog(@"————————%@",NSStringFromRange(range));

    }


163、    // 设置标题

    [btn setTitle:@"按钮" forState:UIControlStateNormal];

    

//获得按钮的标题

    NSString *title = [btn titleForState:UIControlStateNormal];

    

    NSLog(@"%@--——————%@",title,btn.titleLabel.text);


164、    // 取消目标self上所有要调用的方法,这个是NSObject的方法

    [NSObject cancelPreviousPerformRequestsWithTarget:self];


165、数组里面存的是指针,指针类型占用 4 个字节


166、关联方法   IBAction    ,  关联控件   IBOutlet    ,   IB—》Interface Builder 界面建设者


167、NSStringFromCGSize(<#CGSize size#>) 方法


CGRectGetHeight(frame)  、NSStringFromCGRect()


168、选项卡的selectedSegmentIndex 属性


170、//  思考:ios 下 支持哪些格式的图片?

//    jpg png gif...


171、Xcode中的自定义代码片段默认放在~/Library/Developer/Xcode/UserData/CodeSnippets文件夹下


173、动画结束的头文件,animaitonID,context


174、 NSString *str2 = @"123";

    NSString *str3 = @"123"

这种方式创建的这两个字符串是拥有共同的内存地址的

    NSString *str = [NSString stringWithFormat:@"laosun"];

    NSString *str1 = [NSString stringWithFormat:@"laosun”];

这种方式创建的这两个字符串不是同一个内存地址,所以这才是真正的创建字符串的方式

字符串之间的比较不是用“==”,而是用“isEqualToString:(NSString *)”

%p 是 输出内存地址


175、//  字符串类型不能强制类型转换成基本数据类型,要通过相应的方法 [字符串名  intValue]

%% 代表是一个百分号


176、//在.h中声明要实现的协议的协议名,防止警告。

@interface ZYAppDelegate : UIResponder <UIApplicationDelegate,UIActionSheetDelegate,UIAlertViewDelegate>

//  点击ok按钮 调用某个方法(协议方法)

//  1 协议方法一般都在对应的类声明的头文件中,找到通过操作能够自动被调用的协议方法。

//  2 将此方法复制,粘贴到弹出alertview的类中,加以实现。

//  3 方法是自动执行,但是必要有个前提,必须设置delegate为self


177、- (BOOL)respondsToSelector:(SEL)aSelector;


179、代理—协议

//两个类的头文件相互的导入,会引起 交叉导入 的错误。

//#import "ZYNextViewController.h"

//交叉导入 的错误的解决方案:

//@class + 类名

@class ZYNextViewController

@interface ZYViewController : UIViewController

在.m中还需要写:   #import "ZYNextViewController.h”


//协议的定义是独立的。

//通常协议名 的组成  类名+Delegate

@protocol ZYNextViewControllerDelegate <NSObject>

//类比 alertView的协议方法,来指定自己的协议方法,但是我非常清楚,传递不同的值,就会改变不同的背景颜色。

- (void)nextViewController:(ZYNextViewController *)aVC changeBgColor:(int)clickedBtnIndex;

@end


//  [代理  协议方法];

//  当delegate接收到不同的对象时,则就直接用此对象调用协议方法。

//  下面的代码能否顺利执行,必须明确

//   1 _delegate 有没有货

//   2 协议方法是否在相应的类实现


//  判断_delegate能否响应协议方法 

/ / - (BOOL)respondsToSelector:(SEL)aSelector;


    if ([_delegate respondsToSelector:@selector(nextViewController:changeBgColor:)])

    {

        [_delegate nextViewController:self changeBgColor:btn.tag];

    }


180、//非ARC

//retain  保留 类类型

//copy    复制 类类型 NSString copy

//assign  赋值 基本数据类型


//ARC

//strong  ====== retain/copy

//weak    ====== assign


//readonly 只读  getter = isXX 当获得属性值是可以 对象.属性名 获得,或者 对象.isXX

//readwrite 读写


182、不知道有没有发现,用single View Application 创建的入口类名称不能改,只能是AppDelegate,而用Empty Application创建的入口类名称却是可以更改的。

#import <UIKit/UIKit.h>

       入口类的.h 文件                  <UIApplicationDelegate> 实现协议

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@end


类AppDelegate 是UIResponder 的子类,.m中用到了协议 UIApplicationDelegate,方法头是一个协议方法


———————————————————————————————————————————


184、//  NibName nib文件 xib文件

//  bundle  束  打包文件    

//  init 会自动加载与类名同名的xib文件,如果xib文件被修改,则必须使用initWithNibName:bundle:加载修改过的xib文件的名字。


185、//  导航条默认的高度是44

//  状态栏(信号区)默认的高度是20


189、代理、协议  实现4步骤

1⃣️、@protocol  类名+Delegate<NSObject>

@optional

协议方法—(void).....

@end

2⃣️ 在类中声明属性 @property(nonatomic,assign)id<类名+Delegate>delegate

3⃣️、在类.m按钮方法中写:

if([self.delegate  respondsToSelector:@selector(协议方法头)])

{

[self.delegate  clickBtn:协议方法的要传递的参数];

}

4⃣️、在哪里实现时,就再哪里新建对象,并把对象自己交给它的delegate

对象.delegate = self


190、

类型:

1 基本类型

2 类类型

3 id

4 结构体  frame 

5 枚举 NSTextAlignment


191、

调试程序:

1 设备      真机测试

2 模拟器  局限性 打电话 发短信  加速计 陀螺仪


retina  视网膜   高清屏



192、

 [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.window cache:YES];


NO.1 enum 转换方式 翻转、卷曲

NO.2 forView:  对哪个视图   如果实现的是视图间的切换,例如从aView—>bView,那么此参数需要填写的aView和bView的父视图。


194

    UIWindow *window = [[UIApplication sharedApplication] keyWindow];

    [UIView beginAnimations:nil context:nil];

    [UIView setAnimationDuration:1];

    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:window cache:YES];

    [UIView commitAnimations];

    

//  上面代码是以动画的形式执行翻转,如果下面代码写在动画执行的逻辑中,则所有的vc的view的显示和子视图的创建过程都是以动画的形式呈现的,这样就会造成界面的错乱。

       

     window.rootViewController = vc;


195

//  self.view 先开始是来源于xib中view,如果xib中的view是4inch,则此代码中获得是4inch对应的尺寸。所以无论使用的是3.5inch还是4inch的simulator,都是依据xib中view的尺寸。总之,要建立这样一种思维:使用之前,先验证数据的正确性。

———————————————————————————————————————————————


你可能感兴趣的:(iOS开发基础----OC/UI控件)