ViewController
-
ViewController
- 进入VC后先调用loadView,再调用ViewDidLoad
- ViewDidLoad皆为系统调用
- 需要先调用[super viewDidLoad]
- 控制器的View加载完毕的时候调用
- viewLoad进行控件的初始化,数据的初始化
- 其中的self指的是控制器
- 添加控件的顺序是栈的顺序,即先添加的在底下,后添加的在上面
- 接着调用viewWillAppear,再调用viewDidAppear
- 先调用[super viewDidAppear]
- viewDidAppear中可查看控制器的View的父控件UIWindow,只有在加载完毕后才会呈现父控件
- viewDidAppear可以移除view控件
- didReceiveMemoryWaring
- 系统调用
- 当控制器接收到内存警告是调用
- 去除一些不必要的内存,去除耗时内存
- 进入VC后先调用loadView,再调用ViewDidLoad
-
viewController的方法
- performSelector: (nonnull SEL) withObject: (nullable id) afterDelay: (NSTimeInterval):延迟多少时间执行某个方法
- nonull SEL:需要延迟执行的方法
- nullable:该方法传入的参数
- NSTimeInterval:延迟的时间
- performSelector: (nonnull SEL) withObject: (nullable id) afterDelay: (NSTimeInterval):延迟多少时间执行某个方法
-
viewController系统自动调用的方法
- prefersStatusBarHidden:是否隐藏状态栏,返回BOOL类型
XIB
- xib的展示
- (void)viewDidLoad { [super viewDidLoad]; //方式一 UIView *view1 = [[[NSBundle mainBundle] loadNibNamed:@"XIB-NAME" owner:nil options:nil] firstObject]; [self.view addSubview:view1]; //方式二 UINib *nib = [UINib nibWithNibName:@"XIB-NAME" bundle:nil]; UIView *view2 = [[nib instantiateWithOwner:nil options:nil] firstObject]; [self.view addSubview:view2]; }
- xib的注意事项
- 如果一个View从Xib中加载,就不能使用[[XX alloc] init]和initwithframe这两个方法
- 如果一个xib经常被使用,应该提供快速构造方法
- 如果View从Xib创建,会调用initWithCode和awakeFromNib两个方法
- 如果子控件是从Xib中创建的,是出于未唤醒状态的,若要在Xib上创建的子控件上添加子控件,要在awakeFromNib方法中创建
UIView
-
UIView
- 每个控件都继承于UIView
- 比较常见的是将UIView作为容器
- view中只能存放控件,不能拥有属性???
- storyboard中只能用UIView作为容器,只能用UIView添加子控制器
- 所有的控件都是一个容器
- 每个控制器(viewController)都有一个UIView
- 控制器(viewController)本身是不可见的,能够看见的是控制器的View
- 每一个控制器(viewController)都有一个UIView属性
-
UIView对象的常见属性
- superview:获得父控件
- view的父控件为UIWindow
- subViews:获得子控件
- 返回的为一个泛型,为一个数组
- 获取subview的数组通过self.subviews获取到
- tag:控件的ID
- 父控件可以通过tag找到对应的子控件
- transfrom:控件的形变属性
- 可以设置旋转角度、比例缩放、平移等属性
- frame:控件矩形框在父控件中的位置和尺寸
- 以父控件的左上角为坐标原点,更改尺寸是以自身的左上角向右方和下方延伸
- frame.origin:可更改CGRect的x与y
- frame.size:可更改CGRect的wigth和height
- 其中CGRect等都是结构体,在定义该类型属性前不需要加‘*’星号
- bounds:控件矩形框的位置和尺寸
- 以自己左上角为坐标原点,所以bounds的x、y一般为0,也就是说一般只能改变尺寸(ios9以后中心点不变向四周延伸更改尺寸)
- centre:控件中点的位置
- 以父控件的左上角为坐标原点
- autoresizingMask:autoresizingMask的设置
- UIViewAutoresizingFlexibleLeftMargin:距离父控件左边是可以变动的
- UIViewAutoresizingFlexibleRightMargin:距离父控件右边是可以变动的
- UIViewAutoresizingFlexibleTopMargin:距离父控件上边是可以变动的
- UIViewAutoresizingFlexibleBottomoMargin:距离父控件下边是可以变动的
- UIViewAutoresizingFlexibleHeight:高度可以随父控件进行变动
- UIViewAutoresizingFlexibleWidth:宽度可以随父控件进行变动
- translatesAutoresizingMaskIntoConstraints:在使用Autolayout的情况下是否将AutoresizingMask自动转化成约束
- 在用代码添加控件时,该方法默认为YES
- 在使用代码添加约束的时候,要将每一个添加约束的View的该属性修改为NO
- layoutIfNeed:强制刷新界面,约束修改后的动画效果需要用该属性
- iOS9以后该方法只会刷新子控件,不会刷新控件本身
- superview:获得父控件
/************************Frame示例代码**********************/ #import "ViewController.h" @interface ViewController () @property (nonatomic ,weak) UILabel *testLabel; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UILabel *label = [[UILabel alloc] init]; label.frame = CGRectMake(100, 100, 100, 100); [self.view addSubview:label]; self.testLabel = label; //更改frame方式一 self.testLabel.frame = CGRectMake(50, 50, 150, 150); //方法二 //通过强制转换成CGRect self.testLabel.frame = (CGRect){{50,50},{150,150}} //方式三 //结构体是值传递,非地址传递 //CGRect是结构体不能写成CGRect *frame = …… CGRect frame = self.testLabel.frame; frame.origin.x += 50; frame.origin.y += 50; frame.size.width += 50; frame.size.height += 50; //再将frame的值传回self.testLabel.frame self.testLabel.frame = frame; } @end /*************autoresizingMask使用示例代码*******************/ self.testview.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin; /********使用layoutIfNeed制作约束修改后的动画效果代码********/ //已通过storyboard创建了一个UIView对象,并做了分别为距离父View上下左右的四个约束 @interface ViewController () //对storyboard中左约束进行拖线 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *leftconstrain; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //已通过storyboard创建了一个UIView对象,并做了分别为距离父View上下左右的四个约束 } //点击控制器触发 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { //以修改左约束为例 self.leftconstrain.constant = 100; [UIView animateWithDuration:2 animations:^{ [self.view layoutIfNeeded]; }]; } @end
- UIView的常见的对象方法
-
addSubview:添加子控件
- 通过父控件调用该方法添加子控件
-
insertSubview-belowSubview:在某个Subview之下添加子控件
-
removeFromSubview:移除子控件
- 要移除哪个子控件就用该控件调用该方法
- 只要有父控件就一定能够移除
-
viewWithTag:根据一个tag标识找出对应的控件(一般是子控件)
- tag尽量少使用,会混乱,效率很差,内不是递归遍历
- 通过父控件调用该方法传入子控件的tag获得子控件
-
beginAnimations-context:开始动画
-
commitAnimatons:提交动画
-
setAnimationDuration:设置动画时间
-
animateWithDuration-animations:可直接使用闭包的形式创建动画
-
animateWithDuration-animations-completion:可直接使用闭包的形式创建动画
-
animateWithDuration-delay-options-animations-completion:可直接使用闭包的形式创建动画
- delay:可设置延迟时间
- options:动画渐变方式
- animations:动画执行时效果
- completion:以及动画结束后的操作
-
addConstraint:添加约束的方法
-
layoutIfNeeded:强制刷新
-
sendSubviewToBack:将一个继承UIView的子控件添加到View最底层
- 在使用该方法之前依旧需要使用addSubview
- 可用此方法设置UIView的背景图片
-
/************************以下是Tag使用代码****************************/ #import "ViewController.h" @interface ViewController () @property (nonatomic ,weak) UIView *testView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UIView *view = [self.view viewWithTag:1]; self.testView = view;//这句一定要写 } @end /************************以下是动画代码*******************************/ #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIView *testview; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } - (IBAction)pingyi:(UIButton *)sender { [UIView animateWithDuration:2 animations:^{ CGRect frame = self.testview.frame; frame.origin.x += 20; self.testview.frame = frame; }]; } - (IBAction)suofang:(UIButton *)sender { [UIView animateWithDuration:2 animations:^{ CGRect frame = self.testview.frame; frame.size = CGSizeMake(80, 100); self.testview.frame = frame; } completion:^(BOOL finished) { self.testview.backgroundColor = [UIColor blackColor]; }]; } - (IBAction)touming:(UIButton *)sender { /* UIViewAnimationOptionCurveEaseInOut 此为默认方式 UIViewAnimationOptionCurveEaseIn 此为先快后慢 UIViewAnimationOptionCurveEaseOut 此为先慢后快 UIViewAnimationOptionCurveLinear 此为线性方式 */ [UIView animateWithDuration:2 delay:2 options:UIViewAnimationOptionCurveEaseOut animations:^{ self.testview.alpha = 0; } completion:^(BOOL finished) { [UIView animateWithDuration:2 animations:^{ self.testview.alpha = 1; }]; }]; }
- UIView的自动调用的方法
- touchBegan-withEvent:点击控制器的View会自动调用的方法,监听UIView的点击事件
- 自定义UIView
- layoutSubview:布局子控件,可以拿到frame
- 必须调用super
- layoutSubview:布局子控件,可以拿到frame