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(, , , );
[self.view addSubview:label];
self.testLabel = label;
//更改frame方式一
self.testLabel.frame = CGRectMake(, , , );
//方法二
//通过强制转换成CGRect
self.testLabel.frame = (CGRect){{,},{,}}
//方式三
//结构体是值传递,非地址传递
//CGRect是结构体不能写成CGRect *frame = ……
CGRect frame = self.testLabel.frame;
frame.origin.x += ;
frame.origin.y += ;
frame.size.width += ;
frame.size.height += ;
//再将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 = ;
[UIView animateWithDuration: 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:];
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: animations:^{
CGRect frame = self.testview.frame;
frame.origin.x += ;
self.testview.frame = frame;
}]; }
- (IBAction)suofang:(UIButton *)sender {
[UIView animateWithDuration: animations:^{
CGRect frame = self.testview.frame;
frame.size = CGSizeMake(, );
self.testview.frame = frame;
} completion:^(BOOL finished) {
self.testview.backgroundColor = [UIColor blackColor];
}];
}
- (IBAction)touming:(UIButton *)sender {
/*
UIViewAnimationOptionCurveEaseInOut 此为默认方式
UIViewAnimationOptionCurveEaseIn 此为先快后慢
UIViewAnimationOptionCurveEaseOut 此为先慢后快
UIViewAnimationOptionCurveLinear 此为线性方式
*/
[UIView animateWithDuration: delay: options:UIViewAnimationOptionCurveEaseOut animations:^{
self.testview.alpha = ;
} completion:^(BOOL finished) {
[UIView animateWithDuration: animations:^{
self.testview.alpha = ;
}];
}];
}
- UIView的自动调用的方法
- touchBegan-withEvent:点击控制器的View会自动调用的方法,监听UIView的点击事件
- 自定义UIView
- layoutSubview:布局子控件,可以拿到frame
- 必须调用super
- layoutSubview:布局子控件,可以拿到frame