• 流水布局与block深入研究


    9.  自定义流水布局

               9.0UICollectionView与UItableView的区别:在布局(UItableView继承UISorllView),UICollectionView不用设置contentSize
               9.0UICollectionView与UItableView的相同点:循环利用
       
               9.1.0UICollectionView注意点:1.初始化必须要传入布局,(流水布局:九宫格布局)2.UICollectionViewCell必须注册3.必须自定义cell
               9.1.1创建流水布局:尺寸itemSize(item相当与cell),滚动方向scrollD,额外滚动区域sectionI,行间距mini这是设置流水布局内部的
               9.1.2创建UICollectionView,设置尺寸,加载NIB设置背景颜色,自定义cell给cell添加一个UIImage属性

               9.2自定义UICollectionView的布局,了解5个方法
                
                    1.-(void)prepareLayout(作用:计算所有的cell布局,条件:cell布局固定,调用时刻:一开始布局时与UICollectionView刷新的时候会调用)
                    2.-(nullable NSA<__kindof):(CGRect)rect(作用:返回每个cell布局,允许一次性返回所有的cell布局)
                    3.-(BOOL)shouldI:()newBounds(是否允许在拖动的时候新布局)
                    4.-(CGPoint)target offset:(CGPoint)velocity(作用返回最终的偏移量,调用时刻:手指离开时)
           5.-(CGSize)collectionView(作用:设置collectionV滚动范围)
                9.2.1可以给居中的图片方大
                    1.在第2中方法设置距离中心越近越大尺寸
                    2.在第4种方法设置那张照片离中心越近就自动把那张照片放在中心.
     10.block深入研究

                10.0关于代理,modal要传值给vc,要拿到vc对象,让vc成为modal的代理,后根据代理方法传值
                10.1block的基本使用:保存一段代码,并不是马上执行,需要手动调用  inLineBlock快速生成block代码
                10.2block4种使用方式: 通过block();调用
                       1.block声明:返回值(^Block变量名)(block参数类型),参数变量名可以省略
                       void(^block2)()或void(^block1)(int);
                       2.block定义:等号右边^(参数 参数变量名){}(有参无返回值)
                       void(^block2)(int a) = ^(int a){};
                       3.block定义二:等号右边^返回值(参数类型 参数变量名)(有参有返回值)
                       int(^block3)(int a) =^int(int a){return ;};
                       4.block定义三:没有返回值,没有参数,可以省略(无参无返回值)
                       void(^block4)() = ^{};
                 10.2block开发使用场景(block要调用了才会使用里面的内容)
                       1.在同一文件中使用:用strong声明一个属性无参的block,在通过这属性在不同的方法调用
                       2.在不同文件中使用:在模型声明block,到UITableViewDelegate中选中调用,具体问题具体分析
                       3传值:.声明一个带参数的block属性2.在需要传参数控制器中定义block,并在属性中传递参数3.在传值控制器中调用block
                *10.3block内存管理(面试题:block是OC对象吗,去官方文档中查找:working with blocks,上面写了Blocks are Object-C objects)
                       1.内存5个区:堆,栈,方法区,常量区,全局区.
                       2.如何区别ARC,MRC:ARC在dealloc不可以调用[super dealloc],看是否能调用release
                       3.MRC中特点:手动内存管理,需要自己释放内存,开发习惯:访问属性或者设置属性,必须用点语法,不要使用下划线
                       4.MRC没有strong和weak属性, 有assign(相当与weak),retain(相当与strong),copy  
                       5.MRC如何管理block:block放在外部局部变量时或者被static修饰时,放在栈中,其他时候方在全局区(ARC:block放在外部局部变量时,放在堆中)
                       6.MRC注意点:不能使用retain声明block,他放在栈中,只能用copy放在堆中
                       7.ARC如何管理block:外部局部变量,放在堆中:
                       8.ARC注意点:使用strong声明block,不能使用weak:如果没有强指针,就会销毁
                 *10.4block循环引用(block对外部强指针强引用,不会对弱指针强引用)
                      1.原理:modVc会强指针指向modal对象(每一个对象都有一个block),modal对象的block会指向block这个对象,block对象中的block当使用self,又会指回modal对象中的block
                      2.解决方案:使用__weak type(self) weakSelf = self;,当吧强指针换成弱指针时,调用self时会把block对象的指向modal的block的block换成弱指针,当销毁一个时,其他就会全部销毁了.
                      3.注意点:还有一种比较难的,当使用延迟操作或异步任务,就需要搞个strongSelf代替self,再在外部搞个弱指针使他们不会被销毁又不会循环引用.

  • 相关阅读:
    数据结构小总结(成都磨子桥技工学校数据结构前12题)
    Scrum 冲刺博客第二篇
    Scrum 冲刺博客第一篇
    centos部署keepalived服务
    第四周作业
    Svelte 中怎样做双向数据绑定
    Svelte 中多层组件事件转发
    Svelte 中的事件修饰符
    怎样在 Svelte 中设置自定义事件
    怎样使用 Svelte 中的异步块
  • 原文地址:https://www.cnblogs.com/xieyunqq/p/5136721.html
Copyright © 2020-2023  润新知