UI基础(零)之基础知识
// 加法计算器 // ViewController.m // UI基础(一) // // Created by 曹魏 on 2017/3/23. // Copyright © 2017年 itcast. All rights reserved. // #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UITextField *Num1; //这句话的意思就是给界面上的控件起了个名字叫Num1 /* 实际上UITextField是个类型,Num1是个成员属性,在这里,成员属性就代表了界面上的控件 属性什么时候被调用?
当我点击SB上的输入框时就会调用这个类从而会调用属性 */ @property (weak, nonatomic) IBOutlet UITextField *Num2; @property (weak, nonatomic) IBOutlet UITextField *result; @end @implementation ViewController - (IBAction)calculate:(UIButton *)sender { //1.获取界面上的控件 NSString *str1 = self.Num1.text; NSString *str2 = self.Num2.text; //2.输入框内容相加 NSInteger num1 = [str1 integerValue]; NSInteger num2 = [str2 integerValue]; NSInteger resultNum = num1 + num2; self.result.text = [NSString stringWithFormat:@"%ld",resultNum];
//记住取消键盘的方法
[self.view endEditing:YES];
}
@end
小知识点总结:center
// // ViewController.m // 08-bounds和center // // Created by apple on 16/7/4. // Copyright © 2016年 itcast. All rights reserved. // #import "ViewController.h" @interface ViewController () @property(nonatomic,weak) IBOutlet UIButton *iconBtn; -(IBAction)top; @end @implementation ViewController -(IBAction)top{ NSLog(@"向上按钮"); // Expression is not assignable 表达式的格式不正确 // 1. center是一个CGPoint类型的结构体 // 如果一个结构体是一个对象中的成员属性,在写法上不能直接给结构体中的属性赋值,否则会报错 // .的这种写法 在C中是获取结构体中的成员属性 // 在OC中 xx.xx 代表调用方法 // 这是编译器的问题,在OC中编译器默认会把点语法全部转成 getter或者setter方法-->而结构体是没有getter方法的,但是有setter方法
所以,等号右边是getter方法,等号左边是setter方法,由于只能用setter方法所以只能获取结构体再通过setter方法给属性赋值. // 在转换的时候就会出错不认识,当使用结构体的时候,需要单独获取结构体,在进行赋值,这个时候它就不会转为方法 //1. 获取对应的结构体 CGPoint changeCenter = self.iconBtn.center; //2. 修改结构体中的值 changeCenter.y -= 30; //3. 赋值 self.iconBtn.center = changeCenter; } @end
bounds、frame、center区别
小结:UIButton控件基本属性:bounds,center,frame,transform
center和frame是相对于父控件来说的,bounds是相对于自身来说的,所以,可以使用bounds来进行放大缩小操作,center和frame来进行平移操作
上面讲到通常情况下bounds是不变的,但当我们遇到像图片轮播器的时候,改变offset偏移值本质上其实是改变bounds的起点.
所以scrollView中子控件滚动的时候,改变的不是子控件的X,Y值,而是contentoffset偏移值.
transform属性可以进行平移,缩放,旋转但transform和frame不能混合使用,会出现意想不到的错误
transform两种形式三个属性:
形式一:带make的transform:是基于控件初始位置进行变化,所以通常只能变化一次.
形式二:不带make的transform:是基于传进来的transform进行改变.
1.平移:
self.iconBtn.transform = CGAffineTransformTranslate(self.iconBtn.transform, 0, -50);
2.放大缩小:
self.iconBtn.transform = CGAffineTransformScale(self.iconBtn.transform, 1.2, 1.2);
self.iconBtn.transform = CGAffineTransformScale(self.iconBtn.transform, 0.8, 0.8);
3.旋转:
// 正数和负数 顺时针为正 // self.iconBtn.transform = CGAffineTransformMakeRotation( - M_PI_4); self.iconBtn.transform = CGAffineTransformRotate(self.iconBtn.transform, -M_PI_4);
动画的划分
1)渐进动画:其实就是一张图片位置或者状态的改变
包括:1.头尾式动画 2.block式动画
2)序列帧动画:就是多张图片迅速来回切换
重点来了:成员属性修饰符的理解strong和copy
// // ViewController.m // 11-字符串的说明 // // Created by apple on 16/7/5. // Copyright © 2016年 itcast. All rights reserved. // #import "ViewController.h" @interface ViewController () - (IBAction)btnClick; @property (nonatomic,strong) NSString *sString;(1) @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSMutableString *nmString = [NSMutableString stringWithFormat:@"hello"];(2) self.sString = nmString;(3) NSLog(@"改变前--> %@ %@",self.sString,nmString);(4) [nmString appendString:@" world"];(5) // [(NSMutableString *)self.sString appendString:@"aaaaa"]; NSLog(@"改变后--> %@ %@",self.sString,nmString); (6) } @end
如代码所示:
第一步(1)意思是:self.sString指向一个空的地址
第二步(2)意思是:堆区创建了一个内存空间并存放了hello字符串并且有一个nmString指针指向
第三步(3)意思是:由于self.sString是由strong修饰的,所以进行赋值运算的时候self.sString是直接指向nmString这块儿内存的
第四步(4)意思是:输出结果为:hello,hello
第五步(5)意思是:nmString指向的那块内存中的字符串增加了个world
第六步(6)意思是:输出结果为:helloworld,helloworld
如下图更能说明:
如果成员属性修饰符换成copy时:
如下图所示:
copy作为修饰符时,上述代码中的第三步就会变成:
- (void)setSString:(NSString *)sString{
_sString = sString.copy;
}
此时nmString会作为参数传递给sString,如上图就是nmString在堆区中copy一份到常量区中,上述图画的有一点不准确,应该重新弄个常量区用来存放copy后的字符串hello的
所以上述代码中:
第四步(4)输出结果为:hello,hello
第六步(6)输出结果为:hello,helloworld
知识点小结:
属性修饰符和访问修饰符的区别:
OC中的访问修饰符:
@public 公用的,都可直接访问
@protected 本类与其子类中可直接访问
@private 只能被本类中对象方法直接访问
@package 同一框架中可直接访问,非同一框架中无法直接访问
在interface中声明的成员变量默认是protected
在implementation中声明的成员变量,默认是private(在没被他人import的情况下,即使加@public仍然无法被他人引用)
关键字@property与@synthesize
@property 用于生成getter与setter的声明,只能用于interface中 例:@property NSString * name
@synthesize 用于生成getter与setter的实现,只能用于implementation中 例:@synthesize name = _name (若无_name的成员变量,则自动生成private 的_name成员变量)
生成的getter和setter会根据代码中的getter,setter实现情况和成员变量定义情况动态生成缺少的部分,即
若getter或setter已经有实现或声明则只生成没实现或没声明的那部分,若有自动生成getter或setter的实现而且
成员变量未定义,则自动生成private的_开头的成员变量
做个小总结(只说ARC环境下的) 用strong修饰OC对象以及NSString和Block , 没添加到父控件上的控件 用weak修饰已经被添加到父控件上的控件 以及 代理对象 用assign基本数据类型、枚举、结构体(非OC对象) class类型 用copy修饰一种情况下的NSString-->不确定赋值过程中用的是可变还是不可变字符串
注意:使用copy修饰block是MRC时期的遗留物,这在MRC时期是至关重要的事情,但是使用ARC的现在,strong是可以代替的,只是一个习惯问题而已。