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是可以代替的,只是一个习惯问题而已。

 

posted @ 2017-03-29 01:19  忆缘晨风  阅读(345)  评论(0编辑  收藏  举报