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的尺寸。总之,要建立这样一种思维:使用之前,先验证数据的正确性。
———————————————————————————————————————————————