OC 知识补丁(日更)

267 阅读6分钟

IT教程网(可以找资源)

1

  • 每一个控制器都有一个UIView(一对一关系)

  • @property(nonatomic,readonly,copy) NSArray *subviews;

    只有子控件,没有孙子控件

tag

tag的使用范围很小

//多个按钮连接这一个方法
    - (IBAction)clickBtn:(UIButton *)button {
    switch (button.tag) {
        case 3:
            NSLog(@"点击了按钮1");
            break;
        case 4:
            NSLog(@"点击了按钮2");
            break;
        case 5:
            NSLog(@"点击了按钮3");
            break;
        default:
            break;
    }
    // 做公共的事情
    NSLog(@"做公共的事情");
}
  • @property(nonatomic) NSInteger tag;

控件的ID(标识),父控件可以通过tag来找到对应的子控件

UIView *redView = [self.view viewWithTag:1];

根据一个tag标识找出对应的控件(一般都是子控件)

frame&bounds

  • @property(nonatomic) CGRect frame;

label.frame = CGRectMake(100, 100, 100, 60);

控件矩形框在父控件中的位置和尺寸(以父控件的左上角为坐标原点)

  • @property(nonatomic) CGRect bounds;

self.label.bounds = CGRectMake(0, 0, 200, 120);

控件矩形框的位置和尺寸(以自己左上角为坐标原点,所以bounds的x、y一般为0)

bounds只改变大小,不改变位置,中心点不变,向四周延伸

  • @property(nonatomic) CGPoint center;

    控件中点的位置(以父控件的左上角为坐标原点)

  • 继承UIControl的空间可以填加IBAction

  • viewDidLoadd控件数据初始化

  • 控制器view父控件是UIWindow

- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    NSLog(@"viewDidAppear-----%@", self.view.superview);
}

结构体是值传递,不是地址传递

CGRect frame = self.label.frame;
frame.origin.x -= 100; // 改变x值
self.label.frame = frame;

如果参数类型是size_t或者ssize_t,在进行格式化输入或输出的时候务必使用‘z’修饰符

2

图片调整

  • Scale To Fill 铺满

    Aspect Fit 按比例缩放

    Center 图片大小 不变,居中

image.png

    imageView.contentMode = UIViewContentModeScaleAspectFill;
    // 裁剪多余的部分
    imageView.clipsToBounds = YES;

image.png

image.png

  • 虚拟文件夹无论多深都和AppDelegate在同一个文件夹下面

  • repeatcount 0 无限

  • 设置接口多set开头

  • IPA 苹果应用程序文件格式)

图片的两种加载方式:

    1> imageNamed:

      a. 就算指向它的指针被销毁,该资源也不会被从内存中干掉

      b. 放到Assets.xcassets的图片,默认就有缓存

      c. 使用场景:图片经常被使用

    2> imageWithContentsOfFile:

      a. 指向它的指针被销毁,该资源会被从内存中干掉

      b. 放到项目中的图片就没有缓存

      c. 使用场景:不经常用,大批量的图片

毛玻璃

    // 6.加毛玻璃
    // 6.1 创建UIToolBar对象
    UIToolbar *toolBar = [[UIToolbar alloc] init];
    // 6.2 设置toolBar的frame
    toolBar.frame = imageView.bounds;
    // 6.3 设置毛玻璃的样式
    toolBar.barStyle = UIBarStyleBlack;
    toolBar.alpha = 0.98;
    // 6.4 加到imageView中
    [imageView addSubview:toolBar];

3

懒加载

    1.作用:

    1>用到的时候再加载

    2>全局只会被加载一次

    3>全局都可以使用

      过程:

    1.重写成员变量的get方法

    2.在get方法中判断:

      1>如果为空,加载数据

      2>如果不为空,就直接返回数据

- (NSArray *)dataArr{
//当用户使用点语法self.dataArr的属性会直接调用自己重写的setter、getter方法进行访问,使用_dataArr变量的时候只是简单的赋值的操作
    if (_dataArr == nil) {
        // 加载数据
        self.dataArr = @[
                     @{@"name":@"单肩包", @"icon":@"danjianbao"},
                     ];
    }
    return _dataArr;
}
  • 简单的有联系的数据存储可以用 数组里面是字典 搞定
    self.dataArr = @[
                     @{@"name":@"双肩包", @"icon":@"shuangjianbao"},
                     @{@"name":@"斜挎包", @"icon":@"xiekuabao"}
                         ];
    // 设置数据
    NSDictionary *dict = self.dataArr[index];
    iconView.image = [UIImage imageNamed:dict[@"icon"]];
    titleLabel.text = dict[@"name"];

获取沙盒路径

po NSHomeDirectory()

字典转模型

//instancetype避免继承的问题
- (instancetype)initWithDict:(NSDictionary *)dict{
    if (self = [super init]) {
        self.icon = dict[@"icon"];
        self.name = dict[@"name"];
    }
    return self;
}

+ (instancetype)shopWithDict:(NSDictionary *)dict{
    return [[self alloc] initWithDict:dict];
}

自定义控件注意

  • 控件的属性封装在.m

  • 外界可以传入对应的模型数据给view,view拿到模型数据后给内部的子控件设置对应的数据

    • 步骤:
      • 在initWithFrame:方法中添加子控件,提供便利构造方法
      • 在layoutSubviews方法中设置子控件的frame(一定要调用super的layoutSubviews)
      • 增加模型属性,在模型属性set方法中设置数据到子控件上
/**
 * 注意: 创建对象用[[xxx alloc]init]方法和[[xxx alloc]initWithFrame]:方法都会调用initWithFrame:
 */
- (instancetype)initWithFrame:(CGRect)frame{
    if (self =[super initWithFrame:frame]) {
    // 注意:先创建后赋值
    //创建设置子控件
        [self setUp];
    }
    return self;
}
//便利构造方法
- (instancetype)initWithShop:(XMGShop *)shop{
    if (self = [super init]) {
        // 注意:先创建后赋值
        [self setUp];
        self.shop = shop;
    }
    return self;
}

+ (instancetype)shopViewWithShop:(XMGShop *)shop{
    return [[self alloc] initWithShop:shop];
}
 //初始化属性
- (void)setUp{
    UIImageView *iconView = [[UIImageView alloc] init];
    iconView.backgroundColor = [UIColor blueColor];
    [self addSubview:iconView];
    _iconView = iconView;
}
 //布局子控件(可以拿到frame)
- (void)layoutSubviews{
    // 0.一定要调用super
    [super layoutSubviews];
    // 1.获取当前控件的尺寸
    CGFloat width = self.frame.size.width;
    CGFloat height = self.frame.size.height;
    // 2.设置子控件的frame
     self.iconView.frame = CGRectMake(0, 0, width, width);
}
/**
 *  set方法:只要外边传数据就会调用
 *  作用:设置数据
 */
- (void)setShop:(XMGShop *)shop{
    _shop = shop; 
   // 设置数据
    self.iconView.image = [UIImage imageNamed:shop.icon];
}
    //VC中
    XMGShopView *shopView = [XMGShopView shopViewWithShop:self.dataArr[index]];
    shopView.frame = CGRectMake(x, y, width, height);
    [self.shopCarView addSubview:shopView];

构造方法&便利构造方法

  • 构造方法:init方法就是构造方法,是用来初始化对象的方法,注意这是一个对象方法,以减号开头。默认初始化完毕后,所有成员变量的值为0。
- (instancetype)init{
    if (self = [super init]) {
    }
    return self;
}
  • 便利构造方法:
    • 一定是对象方法,以减号开头
    • 方法名一般以initWith开头
- (instancetype)initWithName:(NSString*)name andAge:(int)age
{
    //必须调回父类的构造方法
    if(self = [super init])
    {
        _name = name;
        _age = age;
    }
return self;
}

4

简单MVC

image.png

Xib加载

UIView *carView = [[[NSBundle mainBundle] loadNibNamed:@"CarView" owner:nil options:nil] firstObject];
[self.view addSubview:carView];

Xib+代码

  • 绑定 Xib内 View和已经创建的view .m .h
  • 如果View从xib中加载,就不会调用initinitWithFrame:方法,会调用initWithCoder:方法
  • 如果一个view从xib中加载:用代码添加一些子控件,得在 initWithCoder:awakeFromNib 创建
    • initWithCoder: 给当前view添加子控件
    • awakeFromNib 给当前view的子控件 添加 子控件
    • 推荐使用 awakeFromNib如果子控件是从xib中创建,那么子控件是处于未唤醒状态,该方法会唤醒xib。推荐在其中创建并设置子控件
  • 如果一个xib经常被使用,应该提供快速构造类方法(便利构造方法)
+ (instancetype)shopView{
    return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] firstObject];
}
  • 布局子控件
- (void)layoutSubviews{
    [super layoutSubviews];
    self.label.frame = self.bounds;
    self.toolBar.frame = self.iconView.bounds;
}

字号

  • 正常14

  • 1.f == float1

  • 动画播放 + (void)animateWithDuration: animations: completion:

自定义button布局

  • 自定义类继承UIButton
//设置子控件属性
- (instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
       // 文本居中
        self.titleLabel.textAlignment = NSTextAlignmentCenter;
        // 文本颜色
        [self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
       // 改变图片的内容模式
        self.imageView.contentMode = UIViewContentModeCenter;
    }
    return self;
}
//设置子控件frame
- (void)layoutSubviews{
    [super layoutSubviews];
    // 1.获取自身的尺寸
    CGFloat width = self.frame.size.width;
    CGFloat height = self.frame.size.height;
    // 设置子控件的frame
    self.imageView.frame = CGRectMake(0, 0, width, width);
    self.titleLabel.frame = CGRectMake(0, width, width, height - width);
}

- (void)setShop:(XMGShop *)shop{
    _shop = shop;
    // 设置子控件的数据
    [self setImage:[UIImage imageNamed:shop.icon] forState:UIControlStateNormal];
    [self setTitle:shop.name forState:UIControlStateNormal];

}

设置按钮的内边距

    // 设置按钮的内边距
    //1.设置内容
    self.button.contentEdgeInsets = UIEdgeInsetsMake(-20, 0, 0, 0);
    // 2.设置图片
     self.button.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
    // 3.设置标题
    self.button.titleEdgeInsets = UIEdgeInsetsMake(0, 0, 0, -10);

图片的拉伸

  • 在资源库里设置拉伸保护
  • 代码:UIImage写分类
+ (instancetype)resizableImageWithLocalImageName:(NSString *)localImageName{
   // 创建图片对象
    UIImage *image = [UIImage imageNamed:localImageName];
    // 获取图片的尺寸
    CGFloat imageWidth = image.size.width;
    CGFloat imageHeiht = image.size.height;
    // 返回一张拉伸且受保护的图片
    // 右边需要保护的区域 = 图片的width - leftCapWidth - 1
    // bottom cap =  height - topCapHeight - 1
    return [image stretchableImageWithLeftCapWidth:imageWidth * 0.5 topCapHeight:imageHeiht * 0.5 ];
}

5

contentOffset

  • scrollView的左上角 - contentView的左上角

image.png

image.png 一般都为正数,当出现弹簧效果那样就会有负数

UIScrollView

  • UIScrollViewDelegate:(代理协议的方法--代理方法)
    • \ - (void)scrollViewDidEndDecelerating:停止滚动会调用

挖坑

  • 学新的UIWebView

  • UIStackViewAlignmentBottom

  • iOS 强大的泛型