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 图片大小 不变,居中
imageView.contentMode = UIViewContentModeScaleAspectFill;
// 裁剪多余的部分
imageView.clipsToBounds = YES;
-
虚拟文件夹无论多深都和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
Xib加载
UIView *carView = [[[NSBundle mainBundle] loadNibNamed:@"CarView" owner:nil options:nil] firstObject];
[self.view addSubview:carView];
Xib+代码
- 绑定 Xib内 View和已经创建的view .m .h
- 如果View从xib中加载,就不会调用
init和initWithFrame:方法,会调用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的左上角
一般都为正数,当出现弹簧效果那样就会有负数
UIScrollView
- UIScrollViewDelegate:(代理协议的方法--代理方法)
- \ - (void)scrollViewDidEndDecelerating:停止滚动会调用
挖坑
-
学新的UIWebView
-
UIStackViewAlignmentBottom
-
iOS 强大的泛型