不定时更新
解决图片的渲染效果
1.frame 和 bounds的重新认识
- frame
- 以 父试图内容 的左上角坐标为原点,计算出的 控件自己 矩形框 的位置和尺寸
- bounds
- 以 控件自己内容 的左上角坐标为原点,计算出的 控件自己 矩形框 的位置和尺寸
- 概括
- frame.size == bounds.size
- frame.origin != bounds.origin (UIScrollView)
- UIScrollView.bounds.origin == UIScrollView.contentOffset
2.矩形框和内容的理解
-
矩形框
- 控件自己的显示位置和尺寸
内容
控件内部的东西,比如他的子视图
3.UIScrollView 的重要属性
- frame 只是你看到的大小
- contentSize 实际内容的大小
- contentInset 设置内容的边缘 逆时针
- scrollIndicatorInsets 设置指示器的边缘
- contentOffset 偏移量
UIScrollView 和导航控制器的配合使用
- 为了让我们UIScrollView不被导航栏挡住 导航栏会默认给UIScrollView加一个内边距(64 = 20 + 44)下面的 tabBar 也是同理内边距(49)
- 当有多个UIScrollView的时候,只会调节
第一个
添加UIScrollView,在第一个子控件不是UIScrollView的不会调节 - 可以关闭UIScrollView的自动调整UIScrollView的内边距
- 穿透效果就是用内边距来实现的(ios 7 之后)
- 7 之后开始 tabView 的范围和内容是占据整个屏幕的 7之前则是从导航栏64的下边开始的 注意这里是内容移动了64 矩形框还是原来的大小
自定义内边距:
self.automaticallyAdjustsScrollViewInsets = NO;
scrollView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);
UIWebView
加载网页:
[webVeiw loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://news.baidu.com"]]];
- UIWebView 内部有个UIScrollView 所以给他加导航控制器也会加内边距
contentInset 的调整
- 默认情况下,如果一个控制器A处在导航控制器管理中 并且控制A的第一个子控件是UIScrollView,那么就会自动调整这个UIScrollView的contentInset
- UIEdgeInsetsMake(64, 0, 0, 0); 有导航栏
- UIEdgeInsetsMake(20, 0, 0, 0); 没有导航栏
- 默认情况下,如果一个控制器A处在导航控制器管理中 并且导航控制器又处于UITabBarController管理中 并且控制A的第一个子控件是UIScrollView,那么就会自动调整这个UIScrollView的contentInset
- UIEdgeInsetsMake(64, 0, 49, 0); 有导航栏
- UIEdgeInsetsMake(20, 0, 49, 0); 没有导航栏
禁止上述的内容:
self.automaticallyAdjustsScrollViewInsets = NO;
scrollView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);
给先前创建好的控制器加 xib
注意我们要把控制的 view 设置为我们创建的 xib 不然会报找不到 view 的错误
让文字换行的两个方式
xib 中 option +回车键 (这里加 \n 是不好用的)
代码中 \n
-
按钮的小细节
- 按钮 和 label 不用设置他的长和宽 会根据他们的图片和文字自动设置
- Button的样式为Custom 设置他的背景图片才是不会被修改的文字会变成默认18 直接设置 image属性会在自动变成Custom
-Button 的 image 和 背景图 image 是原图的大小 背景图为整个控件的大小
xib 和 sb 不能直接往控件里添加另一个控件(需要一个 view)
修改状态栏的样式
- ios 7 之前 方法
通过Application 来设置:
[[UIApplication sharedApplication]setStatusBarStyle:(UIStatusBarStyleLightContent)];
- ios 7 之后方法
- 优点 7之前设置而所有的 这个设置了当前的控制器
- -(UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
Button 圆角的方法
方法1
button.layer.masksToBounds = YES;
button.layer.cornerRadius = 5;
-
方法2 KVC XIB SB中使用
[button setValue:@YES forKey:@"layer.masksToBounds"];
[button setValue:@5 forKey:@"layer.cornerRadius"];
-
给xib的约数 加动画
[ UIView animateWithDuration:0.25 animations:^{- 强制刷新马上修改上面设置的约数
- view 会把上面的子控件都刷新一遍
[self.view layoutIfNeeded];
}];
[ UIView animateWithDuration:0.25 animations:^{
修改 UI 控件的代码(frame)
}];自定义控件 的使用
修改UItextField 的光标的颜色:
self.tintColor = [UIColor whiteColor];
带有属性的字符串(富文本)
- 有两部分组成
- 文字内容 : NSString *
- 文字属性 :NSAttributedString
- 字典的 key 值 带有属性的字符串 他是不可变的 要想便使用 他的子类NSMutableAttributedString
- NSDictionary *
- 文字颜色 - NSForegroundColorAttributeName
- 文字大小 - NSFontAttributeName
- 下划线 - NSUnderlineStyleAttributeName
- 背景色 - NSBackgroundColorAttributeName
- 用途 只要是显示文字的时候都可以使用它
初始化
NSMutableDictionary *attributes = [NSMutableDictionary dictionary];
attributes[NSForegroundColorAttributeName] = [UIColor yellowColor];
attributes[NSBackgroundColorAttributeName] = [UIColor redColor];
attributes[NSUnderlineStyleAttributeName] = @YES;
NSMutableDictionary *attributes = [NSMutableDictionary dictionary];
attributes[NSForegroundColorAttributeName] = [UIColor whiteColor];
NSAttributedString * string = [[NSAttributedString alloc] initWithString:self.placeholder attributes:attributes];
- NSMutableAttributedString
- 继承自 : NSAttributedString : NSObject
- 常见的方法
//添加 range 范围属性 同一个范围,可以不断累加属性 一个一个的添加
- (void)addAttribute:(NSString *)name value:(id)value range:(NSRange)range;
//一次可以添加多个属性
- (void)addAttributes:(NSDictionary *)attrs range:(NSRange)range;
//设置 range 范围属性 重复设置统一范围的属性 最后一次才会有效哦
- (void)setAttributes:(nullable NSDictionary *)attrs range:(NSRange)range;
UIScrollView xib 和 sb 中添加约束
- 上下滚动
- 添加一个UIview 类型····················子控件1(UIScrollView唯一的一个子控件)
assign 和 weak 和 strong的区别
- 相同点
- 都是用来修饰对象类型的
- 都是弱引用(弱指针) assign 和 weak 代理使用 weak block 使用 copy
- 出了作用域会被销毁出了作用域会把指针清空
不同点
- assign 会生成 __unsafe_unretained _dog
- 不保住他的命不对他计数加1
- weak 会生成 __Nullable__weak_dog 可以为空的
继续访问 assign 会报错 访问了僵尸对象 是因为他的指针还是指向原来的那个地址
继续访问 weak 会把指针指向为空
所以 weak 是比 assign 安全的
@property (nonatomic,strong) NSString *dog;
// 会生成 NSString *__unsafe_unretained _dog的成员变量
// 1 不是强引用
// 2如果引用的 oc 对象销毁了 指针并不会被销毁 依然指向销毁的对象 产生野指针
@property (nonatomic,weak) NSString *dog;
// 会生成 NSString *__Nullable__weak_dog的成员变量
//不是强引用
//2如果引用的 oc 对象销毁了 指针并会被销毁指向 nil 永远也不会产生野指针
用途
- assign 用在基本数据类型上面 比如 int double等 效率会快一点
- weak 一般用在代理对象上面 用来解决循环强引用
- strong 是强引用出了作用域不会销毁
- strong 啥也没有 (默认)
如何监听一个空间内部的事件
- 如果继承自 UIControl
//对象添加一个监听器 可以自己监听自己
-(void)addTarget:<#(nullable id)#> action:<#(nonnull SEL)#> forControlEvents:<#(UIControlEvents)#>
- 代理成为他的代理
- 通知 敲一下空间名看看有没有通知
- 利用内部的某些机制
监听TextField的获得焦点和失去焦点
addTarget
[self addTarget:self action:@selector(editingDidBegin) forControlEvents:(UIControlEventEditingDidBegin)];
//UIControlEventEditingDidBegin 1.开始编辑 2.聚焦 3. 弹出键盘
[self addTarget:self action:@selector(editingDidBegin) forControlEvents:(UIControlEventEditingDidEnd)];
//UIControlEventEditingDidEnd 1.结束编辑 2. 失去焦点 3 .退下键盘
[self addTarget:self action:@selector(editingChanged) forControlEvents:(UIControlEventEditingChanged)];
UIControlEventEditingChanged 1 正在编辑的时候 写 删
delegate
利用内部的某些机制
//调用时刻 : 成为第一响应者(开始编辑\\弹出键盘\\获得焦点)
- (BOOL)becomeFirstResponder
{
self.placeholderColor = [UIColor whiteColor];
return [super becomeFirstResponder];
}
// 调用时刻 : 不做第一响应者(结束编辑\\退出键盘\\失去焦点)
- (BOOL)resignFirstResponder
{
self.placeholderColor = [UIColor grayColor];
return [super resignFirstResponder];
}
枚举说明
- (算数运算符)
- 1 <<(左移) n == 2的n 次方
| 按位或 只要有一个是1 结构就是1
& 按位与 只有两个都是1 结果才是1 枚举只有是这个类型的才可使用|(使用多个参数一个为1就为1)
CocoaPods
查看已想用的指令的方法 pod -install -help
Podfile.lock会保存最后一次更新 pods 时所有的第三方框架的版本号 用于团队开发,上传到服务器的时候不会上传 pods 文件(太大)我们要根据Podfile.lock自己下载第三方
安装框架之前会默认执行 pod repo update 指令会把最新的第三方的版本下载到你的服务器 在根据你的指令判断是不是要更新第三方
-
常见指令的区别
- pod - install
- 根据Podfile文件安装第三方框架
- 会直接下载Podfile.lock中的版本号来安装
- 如果一开始Podfile.lock文件不存在,会安装Podfile文件雷剧的版本号安装第三方
- 根据Podfile文件安装第三方框架
- pod - update
- 根据Podfile文件安装第三方框架
- 会忽略Podfile.lock文件,将说有的第三方框架跟新到最新版本,创建一个新的Podfile.lock文件
- 根据Podfile文件安装第三方框架
- pod - install -- no - repo - update
- pod - update-- no - repo - update
- 根据Podfile文件安装第三方框架
- 不会执行pod repo update 指令就不会更新第三方的版本电脑上是什么就是什么
- pod - install
终端的常见 指令
- pwd 显示当前路径
九宫格布局
- 用 SDWedImage 设置button 的图片
[button sd_setImageWithURL:[NSURL URLWithString:model.icon] forState:(UIControlStateNormal)];
解决tabview设置 tableFooterView 时 contrntSize 不正确的问题
tabview.tableFooterView = footerView;
// 刷新数据(会从新计算contrntSize)
[tabview reloadData];
查找字符串的常见方法
// 如果 range.location == 0 说明是以 searchString 开头
// 如果 range.location == NSNotFound 或者 range.length == 0 说明没有找到对应的字符串
- (NSRange)rangeOfString:(NSString *)searchString;
// 是否已 str 开头
- (BOOL)hasPrefix:(NSString *)str;
// 是否已 str 结尾
- (BOOL)hasSuffix:(NSString *)str;
//是否包含了 str 不管是 头部 中间 尾部
- (BOOL)containsString:(NSString *)str
在控制器自定义的 view 里拿到相应点击的控制器
UITabBarController *tab = (UITabBarController *)self.window.rootViewController;
//获取那个位置的导航控制器
UINavigationController *nav = tab.childViewControllers.lastObject;
[nav pushViewController:webvc animated:YES];
//获取你选中的那个导航控制器
UINavigationController *nav = tab.selectedViewController
数学计算公式
- 已知总数 和每一行显示的最多数 求有多少行或者多少页
- int rowsCount = (总数 + 每一行最多显示的数量 - 1) /每一行最多显示的数量
static 的作用
-
1 static 可以修饰局部变量
- 让局部变量只初始化一次
- 局部变量在程序中只有一份内存
- 但是他的作用域是不变的 变得只是他的生命周期
-
2 static 可以修饰全局变量
- c 语言 extern 的作用 引用
- 默认的全局变量在程序中是都可以访问的 但是我们要想让他的作用域是当前文件 我们就要使用 static
copy 和 mutableCopy
用 copy 也相当于 是一个强指针
copy 指针拷贝 浅拷贝
用在不可变的 NSString..
因为 我们这里产生的是不可变的,没有必要再去创建一个新的对象,说以苹果就直接拷贝指针
mutableCopy 对象拷贝 深拷贝
用在可变的NSMutableString