![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
实战
iOS开发疯狂者
这个作者很懒,什么都没留下…
展开
-
heightForRowAtIndexPath、estimatedHeightForRowAtIndexPath(计算cell高度和估算cell高度)
heightForRowAtIndexPath(计算cell的高度)这个方法特点1.默认情况下(没有设置estimatedHeightForRowAtIndexPath情况下)1> 每次刷新表格的时候,有多少数据,这个方法就一次性调用多少次(比如有100条数据,每次reloadData,这个方法就会一次性调用100次)2> 每当有cell进入屏幕范围内,就会调用一次这个方法2.设置估算高度情况下1> 显示了哪个cell才会调用这个方法去计算cell的高度(方法调用频率降低)/原创 2020-05-22 22:52:26 · 1219 阅读 · 0 评论 -
tableView的重要属性分析
什么是内容?内容包括什么?1.cell2.tableHeaderView\tableFoterView3.sectionHeader\sectionFootercontentSize.height:所有内容的总高度contentInset:在内容周围额外增加的间距(内边距),始终粘着内容contentOffset:内容距离frame矩形框,偏移了多少frame:是以父控件内容的左上角为坐标原点{0,0}bounds:是以自己内容的左上角为坐标原点{0,0}contentOffset.y原创 2020-05-13 08:40:45 · 133 阅读 · 0 评论 -
特定构造方法
1> 后面带有NS_DESIGNATED_INITALIZER的方法,就是特定构造方法2> 子类如果充血了父类的【特定构造方法】,那么【必须】用super调用父类的【特定构造方法】,不然会出现警告原创 2020-05-13 08:39:31 · 114 阅读 · 0 评论 -
按钮的状态分析
按钮的状态分析一、按钮的状态1.UIControlStateNormal1> 除开UIControlStateHighlighted、UIControlStateDisabled、UIControlStateSelected,都是normal状态2> 这种状态下的按钮 【可以】接收点击事件2.UIControlStateHighlighted1> 【当按住按钮不松开】或者【highlighted = YES】时就能达到这种状态2> 这种状态下的按钮【可以】接收点击原创 2020-05-13 08:39:00 · 402 阅读 · 0 评论 -
万能公式
Row = (count - 1) / cols + 1原创 2020-05-13 08:38:29 · 244 阅读 · 0 评论 -
SFSafariViewController
作用专门用来展示网页需求既想要在当前应用页面展示网页,又想要safari功能 iOS9才能用实现 NSURL *url = [NSURL URLWithString:item.url]; SFSafariViewController *safarVc = [[SFSafariViewController alloc] initWithURL:url]; //modal方法实现,当我们点击done的时候,自动返回 self presentViewController:safarVc a原创 2020-05-13 08:37:39 · 383 阅读 · 0 评论 -
屏幕适配
1.一个View从xib加载,需不需要在重新固定尺寸:一定要重新设置一下2.在viewDidLoad设置控件frame好不好:开发中一般在viewDidLayoutSubviews布局子控件,在viewDidLoad中调整尺寸没有效果原创 2020-05-13 08:37:07 · 69 阅读 · 0 评论 -
tabView底层实现
1.首先把所有cell的位置全部计算好,保存2.当cell要显示的时候,就会拿到这个cell去设置frame cell.frame = self.frams[row];原创 2020-05-13 08:36:37 · 131 阅读 · 0 评论 -
让cell下面的分割线占据全屏
第一种:我们清空分割线,自定义一个View,将View设置尺寸第二种:系统属性(iOS8之后支持)//tabViewController中实现self.tableView.separatorInset = UIEdgeInsetsZero;//Cell中实现self.layoutMargins = UIEdgeInsetsZero;我们只要是写了这两个,就会将分割线占据全屏第三种:万能方式(重写cell的setFrame)步骤1.取消系统自带分割线2.把tableView背景色设置原创 2020-05-13 08:36:05 · 108 阅读 · 0 评论 -
UIBarButtonItem, UINavigationItem, tabBarItem
在控制器上方UIBarButtonItem:描述按钮具体的内容UINavigationItem:设置导航条上内容(左边, 右边, 中间)在控制器下方tabBarItem:设置tabBar上按钮内容(tabBarButton)原创 2020-05-13 08:35:34 · 75 阅读 · 0 评论 -
将tabBarItem中的图片移动位置
imageInsets:tabBarItem的属性,可以让图片挤下去self是UITabBarController,这个控制器下面有一个条,里面存放我们添加的控制器,并且将条均分,之后可以点击来切换控制器(tabBarItem)MrHongtaoPublishViewController *publishVc = [[MrHongtaoPublishViewController alloc] init]; [self addChildViewController:publishVc]; publ.原创 2020-05-13 08:35:00 · 575 阅读 · 1 评论 -
UIAppearance
appearance注意点1.只要遵守了UIAppearance协议,还要实现这个方法2.哪些属性可以通过appearance设置:只有被UI_APPEARANCE_SELECTOP宏修饰的属性,才能设置3.只能在控件显示之前设置,才有作用举例(我们将所有的按钮控件从绿色变成红色)因为直接修改switch的话,他已经显示到view上面了,appearance根本不好用,所以我们可以移除再次添加,可是我们不可能一个一个拿到再次移除,所以我们直接将他的父控件移除再次添加//将控制器的view移除原创 2020-05-13 08:34:25 · 280 阅读 · 0 评论 -
项目结构确定
main.m做的事情1.创建UIApplication(1)打开网页, 发短信, 打电话2)设置应用程序提醒数字3)设置联网状态4)设置状态栏)2.创建AppDelegate代理对象,并且成为UIApplication代理(监听整个app生命周期,处理内存警告)3.开启主运行循环,保证程序一直运行(runloop:每个线程都有runloop,主线程runloop自动开启)4.加载info.plist,判断是否指定了main.storyboard,如果指定,就回去加载(1)创建窗口2)设原创 2020-05-12 08:59:35 · 109 阅读 · 0 评论 -
启动图片
优先级:LaunchScreen > LaunchImage在Xcode配置了,不起作用:1.清空xcode村换2.直接删掉程序,重新运行如果是通过LaunchImage,必须让你的美工提供各种尺寸的启动图片LaunchScreen:Xcode6开始才有好处:1.自动识别当前真机或者模拟器的尺寸2.只要让美工提供一个可拉伸图片3.展示更多东西(控件也可以添加上去)LaunchScreen:底层实现:吧LaunchScreen截屏,生成一张图片,作为启动界面...原创 2020-05-12 08:59:04 · 143 阅读 · 0 评论 -
颜色通道
颜色:3种颜色通道 R G B颜色表达方式:24位,32位,每个颜色通道是8位,0~255UIColor *color = [UIColor colorWithRed:213 / 256.0 green:213 / 256.0 blue:213 / 256.0 alpha:1];抽取成宏# define LHTColor(r, g, b) [UIColor colorWithRed:(r) / 255.0 green:(g) / 255.0 blue:(b) / 255.0 alpha:1.原创 2020-05-12 08:58:33 · 260 阅读 · 0 评论 -
自定义流水布局
只有系统达不到我们想要的效果,我们就可以自定义创建一个类继承UICollectionViewFlowLayout,这个类就是自定义的流水布局(FlowLayout)重写他的方法,扩展功能/*什么时候调用:collectionView第一次布局,collectionView刷新的时候也会调用作用:计算cell的布局,条件:cell的位置是固定不变的*/- (void)prepareLayout{ [super prepareLayout];}/*作用:计算collection.原创 2020-05-12 08:54:32 · 318 阅读 · 0 评论 -
一种特别的封装思想(一般用在封装控件,因为会用到很多属性)
举例原代码 UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:flow]; collectionView.center = self.view.center; collectionView.backgroundColor = [UIColor brownColor]; collectionView.bounds原创 2020-05-12 08:54:02 · 102 阅读 · 0 评论 -
UICollectionView
基本使用注意点:1.UICollectionView必须要有布局参数2.如果要使用UICollectionViewCell,必须要通过注册3.cell必须要自定义,系统cell没有任何子控件我们创建一个photoCell类来管理我们的cell(带有xib)一个ID的全局变量,用来注册cellstatic NSString * const ID = @"cell";在ViewController.m中实现(遵守数据源协议)(后续可以抽取方法) //流水布局:调整cell尺寸原创 2020-05-12 08:53:28 · 81 阅读 · 0 评论 -
Block
基本使用声明返回值(^block变量名)(参数)void(^block)();定义第一种void(^block)() = ^(){};第二种如果没有参数,参数可以隐藏,如果有参数,定义的时候必须要写参数,而且必须要有参数变量名void(^block)(int) = ^(int a){};第三种block返回可以省略,不管有没有返回值,都可以省略int(^block)() = ^int{ return 0;};类型:int(^)(NSString原创 2020-05-12 08:52:59 · 109 阅读 · 0 评论 -
Bounds和Frame
简介frame:以父控件左上角为原点bounds:以自己的左上角为原点,bounds x, y永远为0(❌)frame和bounds都是用来描述一块区域区别frame:描述可视范围bounds:描述可视范围在内容的区域bounds:修改内容原点注意:所有的子控件都是相对于内容相对性可视范围相对于父控件位置永远不变可视范围相对于内容,位置改变...原创 2020-05-12 08:51:24 · 113 阅读 · 0 评论 -
assign和weak的区别
ARC才有weakweak:__weak 弱指针,不会让引用计数器+1,如果只想对象被销毁,指针会自动清空assign:__unsafe_unretained修饰,不会让引用计数器+1,如果指向对象被销毁,指针不会清空原创 2020-05-12 08:50:52 · 81 阅读 · 0 评论 -
Size 和 center
如果size,从frame取出来,先设置size, 再设置center如果size,从bounds取出来,就不用考虑center和size的顺序下面两个部分代码顺序调换过来,效果就不是我们想要的CGRect frame = redView.frame;frame.size = CGSizeMake(200, 200);redView.frame = frame;redView.center = self.view.center;下面两个部分代码顺序调换过来,效果都是一样的CGRect.原创 2020-05-12 08:50:22 · 80 阅读 · 0 评论 -
UIScrollView的自动布局
我们在Storyboard中拖UIScrollView控件,再次向UIIScrollView上面拖动控件,基本就会报错,因为我们需要给UIScrollView设置自动布局首先确定scrollView滚动范围 => 如何在stroboard对scrollView确定滚动范围 => 搞一个专门view去确定scrollView的滚动范围 => 如何确定:水平 和 垂直方向 => scrollView水平能否滚动:view的宽度 + 左右两边间距 才能确定scrollView水平滚动区.原创 2020-05-11 09:33:56 · 137 阅读 · 0 评论 -
static和extern使用
static1.修饰局部变量,被static修饰局部变量,延长生命周期,跟整个应用程序有关被static修饰局部变量,只会分配一次内存被static修饰局部变量什么时候分配内存?程序一运行就会给static修饰变量分配内存2.修饰全局变量,被static修饰全局变量,作用域会修改,只能在当前文件下使用与const联合使用我们想让一个全局变量只在当前文件夹下使用,并且不能修改static NSString * const name = @"name";extern声明外部原创 2020-05-11 09:30:55 · 128 阅读 · 0 评论 -
const的基本使用
作用1.修饰右边基本变量或者指针变量 int a. int *p2.被const修饰变量只读举例修饰基本变量int const a = 3;const int a = 3;修饰指针变量int a = 3;//*p不能修改int const *p = &a;//p不能修改int * const p = &a;面试题int * const p; //p:只读 *p:变量int const * p1; //p1:变原创 2020-05-11 09:30:05 · 82 阅读 · 0 评论 -
const与宏的区别
之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量编译时刻:宏是预编译(编译之前处理),const是编译阶段编译检查:宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误宏的好处:宏能定义一些函数,方法。const不能宏的坏处:使用大量宏,容易造成编译时间久,每次都需要重新替换注意:很多Blog都说使用宏,容易造成很多内存,我这验证并不会生成很多内存,宏定义的是常量,常量都放在常量区,只会生成一份内存...原创 2020-05-11 09:29:26 · 199 阅读 · 1 评论 -
super, superClass, class
class:获取当前方法调用者的类superclass:获取当前方法调用者的父类super:只要编译器看到super这个标志,就会让当前对象去调用父类方法,,本质还是当前对象在调用原创 2020-05-11 09:28:54 · 118 阅读 · 0 评论 -
KVC的底层实现(字典转模型举例)
[item setValue:@"来自即刻笔记" forkey:@"source"];1.首先去模型中查找有没有setSource,找到,直接调用赋值 [self setSource:@“来自即刻笔记”]2.去模型中查找有没有Source属性,有,直接访问属性赋值source = value3.去模型中查找有没有_source,有,直接访问属性赋值_source = value找不到,直接报错 setValue:forUndefinedKey:报找不到的错误重写系统方法?1.想给系统添加额外原创 2020-05-11 09:28:22 · 98 阅读 · 0 评论 -
Runtime(消息机制)
在使用runtime的时候,必须配置文件,buildSettings中搜索runtime,找到Enable Hardened Runtime选项,之后变成YESruntime:必须要导入头文件 <objc/message.h>任何方法调用本质:发送一个消息,用runtime发送消息,OC底层实现通过runtime实现验证;方法调用,是否真的是转换为消息机制runtime都有一个前缀,谁的事情使用谁id objc = [NSObject alloc];类方法本质:类对象调用[N原创 2020-05-11 09:27:49 · 671 阅读 · 0 评论 -
iOS9新特性之__kindof
kindof : 相当于__kindof : 表示当前类或者他的字类id : 可以调用任何对象方法,不能进行编译检查父类写函数申明@interface Person+ (__kindof Person *)person;//写方法的时候在返回类型的前面写上,这样我们子类调用方法的时候就不会报警告了@end子类实现@implementation SubPerson+ (instancetype)person{ return [[self alloc] init];}@end.原创 2020-05-11 09:27:17 · 175 阅读 · 0 评论 -
iOS9新特性之泛型
泛型:限制类型为什么要推出泛型?迎合swift泛型作用1.限制类型2.提高代码规范,减少沟通成本,一看就知道集合中是什么东西泛型声明:在声明类的时候,在类的后面<泛型名称>泛型定义用法:类型<限制类型>(使用类创建对象的时候)泛型仅仅是报警告泛型好处:1.从数组中取出来,可以使用点语法2.给数组添加元素,有提示泛型在开发中使用场景:用于限制集合类型id是不能使用点语法为什么集合可以使用泛型?使用泛型,必须要先声明泛型? => 如何声明泛型自定义泛型.原创 2020-05-11 09:26:52 · 180 阅读 · 0 评论