ViewController

ViewController

  • ViewController

    • 进入VC后先调用loadView,再调用ViewDidLoad
      • ViewDidLoad皆为系统调用
      • 需要先调用[super viewDidLoad]
      • 控制器的View加载完毕的时候调用
      • viewLoad进行控件的初始化,数据的初始化
      • 其中的self指的是控制器
      • 添加控件的顺序是栈的顺序,即先添加的在底下,后添加的在上面
    • 接着调用viewWillAppear,再调用viewDidAppear
      • 先调用[super viewDidAppear]
      • viewDidAppear中可查看控制器的View的父控件UIWindow,只有在加载完毕后才会呈现父控件
      • viewDidAppear可以移除view控件
    • didReceiveMemoryWaring
      • 系统调用
      • 当控制器接收到内存警告是调用
      • 去除一些不必要的内存,去除耗时内存
  • viewController的方法

    • performSelector: (nonnull SEL) withObject: (nullable id) afterDelay: (NSTimeInterval):延迟多少时间执行某个方法
      • nonull SEL:需要延迟执行的方法
      • nullable:该方法传入的参数
      • 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以后该方法只会刷新子控件,不会刷新控件本身
/************************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
原文地址:https://www.cnblogs.com/igeniuswwh/p/6209151.html