ios重要组件

一、UIView *a,UIView*b,UIView*c

b在a的上方,覆盖a,如果我们想要在b上显示一些东西,不能简单的加载a上,这样会找不到,要把它加在b上才能显示。

按照分析,我们把视图c加到a上,那c与b就处于同一个级别了,应该也可能能展示,但是事实上,如果我们这么做,c就不会显示 。

http://www.jianshu.com/p/a577023677c1

二、bounds 和frame 

 (1)、 frame: 该view在父view坐标系统中的位置和大小。(参照点是,父亲的坐标系统)

 

       bounds:该view在本地坐标系统中的位置和大小。(参照点是,本地坐标系统,就相当于ViewB自己的坐标系统,以0,0点为起点(起点能改变))

(2)、修改bounds,不会影响其在父视图中的位置,但会影响其子视图在其里面的位置。(但bounds是相对于自身坐标系的位置和尺寸的,什么意思呢,我们去修改视图bounds的origin试试,我们发现视图本身没有发生变化,但是它的子视图的位置却发生了变化,因为bounds的origin值是基于自身的坐标系,当自身坐标系的位置被改变了,里面的子视图肯定得变化(源自网络))。

(3)、自身坐标系统为什么还能改变呢(默认是(0,0)),当我们改了bounds后,比如为(10,10),自身怎么能为(10,10)我们怎么理解,理解为我们把自身就放在坐标系里面的(10,10)位置。

(4)、view.bounds.origin.x和view.bounds.origin.y是不可赋值的,但是view.bounds可以,此外view.frame.origin.x和view.frame.origin.y也是不可赋值的,但是view.frame可以。

(5)、每个view都有一个本地坐标系统。这个坐标系统作用比较重要,比如触 摸的回调函数中的UITouch里面的>坐标值都是参照这个本地坐标系统的坐标。当然bounds这个属性也是参照这个本地坐标系统来的。其实本地坐标系统的关键就是要知道的它的原点(0,0)在什么位置(这个位置又是相对于上层的view的本地坐标系统而言的,当然最上面的一层view就是 window它的本地坐标系统原点就是屏幕的左上角了)。通过修改view的bounds属性可以修改本地坐标系统的原点位置。

(6)、当我们改变bounds的时候为什么其子视图会变化?

可以这么理解,我们改变bounds后就相当于改变了本地坐标系统的原点的位置,而其子视图的frame 的x和y都是相对于原点位置的,而不是相对于父视图的左上角的位置(实际习惯理解就是相对于父视图的左上角的位置,是因为实际应用中父视图的左上角的就是坐标原点),设置为bounds后,就相当于确定左上角不是坐标原点了,江山易主了。

(7)、改变bounds,可以理解为改变坐标系统,不常用,默认的坐标原点就是视图左上角,也就是默认的bounds.origin就是(0,0)

三、滑动视图的一些精髓

参考文章

 

https://objccn.io/issue-3-2/

(1)、如果你的绘制超出了视图的 bounds,那么超出的部分就不属于光栅化图片的部分了,并且会被丢弃。

(2)、注意,如果我们移动 button 直到它的一部分已经在紫色父视图 bounds 的外面,当光栅化图片被截去时这部分也将会通过同样的绘制方式被截去。然而,技术上讲,因为 iOS处理组合方法的原因,你可以将一个子视图渲染在其父视图的 bounds之外,但是光栅化期间的绘制不可能超出一个视图的 bounds。

(3)、巧妙的是通过改变这个紫色视图的 bounds,它每一个单独的子视图都被移动了

(4)、你可以像这样记下 content offset的最大值:

contentOffset.x = contentSize.width - bounds.size.width;

contentOffset.y = contentSize.height - bounds.size.height;

(5)、如何在自己的代码中使用 content inset?当键盘在屏幕上时,有一个很好的用途:你想要设置一个紧贴屏幕的用户界面。当键盘出现在屏幕上时,你损失了几百个像素的空间,键盘下面的东西全都被挡住了。

(6)、contentOffset 甚至不是实际存在的。代码看起来像这样

- (void)setContentOffset:(CGPoint)offset

{

    CGRect bounds = [self bounds];table view为了适应每一个cell,它的可滚动区域是通过精心计算的

    bounds.origin = offset;

    [self setBounds:bounds];

}

(7)、因为 table view设置了 content inset,这将允许 content offset将 refresh control 弹回到可滚动区域

8、当你滚动经过 table view 的第一个或最后一个 cell 的边界时,table view将 content offset弹回并复位,所以 cells又一次恰到好处的紧贴 scroll view的 bounds。

(9)、contentInset 属性可以改变 content offset 的最大和最小值,这样便可以滚动出可滚动区域,实际并未改变contentsize的大小

参考博文

https://peiweichen.github.io/understand-scrollview-contentoffset-contentinset/

(10)、为什么uitaleview能往下滑动,但是uiscrollview却不能,因为tableView做了精心的处理,估测与contentset有关

(11)、把视图换位列表之后,往上滑都不能滑动了。

(12)、contentInset可以为scrollview内嵌更多(更少)可滑动的空间,contentInset.top = 10会在scrollView的顶部增加10的多余可滑动空间

 

https://ke.qq.com/webcourse/index.html#course_id=171725&term_id=100200899&taid=1572061109722829&vid=u1416smyl60

 

http://blog.csdn.net/sunyong_shj/article/details/53562673

 

(13)、bounds和panGestureRecognize就是实现UIScrollView滑动效果的关键技术点。

(14)、寺库艺术上墙功能里面的挪动图片其实就相当于一个滑动视图,照相区域就相当于contentsize

(15)、滑动视图适配经典文章:

https://bestswifter.com/uiscrollviewwithautolayout/

(16)记住scrollview contentsize.height 可能少于scrollview.height

四、经历知识

1、关于attiributetext知识

(1)、我们对label只设置了text没有设置attributetext,那么我们通过attributext来计算lable高度的时候,永远都是一行的高度

(2)、let nameAttributeDic = [NSAttributedStringKey.font:UIFont.pingFangLight(ofSize: 12),NSAttributedStringKey.foregroundColor:UIColor(fromHexRGB: "0x333333")]as [NSAttributedStringKey :Any]

如果们设置了attributext ,没有设置这个text相应的attribute,但我们通过直接方式给label添加了font和textColor,如NSMutableAttributedString.init(string: titleValue)

这个其实就等效于NSMutableAttributedString.init(string: titleValue, attributes: nameAttributeDic)

(3)、最好的方式不要直接设置属性( titleLabel.font = UIFont.pingFangLight(ofSize: 12)

   titleLabel.textColor = UIColor(netHex: 0x333333))

而是通过NSMutableAttributedString.init(string: titleValue, attributes: nameAttributeDic)来设置

2、即使这样components也会是两个元素的数组不过是空数组

 NSString *text = @"\n";

 NSArray* components = [textcomponentsSeparatedByString:@"\n"];

所以通过compnents的数量也是判断字符串是否包含\n的方法

3、selectionStyle = .none

为什么不能在创建tableView里面设置cell的方式?

可以的,只是你设置错了,是你自己粗心,位置你没有设置对,你应该找准位置进行设置。

4、a > b ?: b 是什么意思

等价于a>b ?a>b:b

5、 if ([stringisKindOfClass:[NSString class]]) {

        NSLog(@"dddd");

    }

这种判断是非常必要的,如果string = nil就不会通过

6、经验:在设置距离上,线到标签的距离应相应减少两个像素左右,标签本身上下就有空隙的

7、numberOfLines 的默认值是1

8、开发一些笔记和想法

(1)、子类要能继承父类的方法,要将父类方法放到h文件,如果子类重写父类方法时,当子类调用这个父类方法时,会调用子类重写的方法

(2)、switch case 要用固定的,不确定的尽量用if 

(3)、给一个对象添加约束时,要把之前同类型的约束去掉,再添加,这个不像赋值,后面的赋值会替换先前的赋值,约束不会。

(4)、瀑布流的布局跟一般的布局是完全不一样的,一般的布局是

12

34类型,但是瀑布流是最大限度利用空间,当一个竖列表没有填满时,会继续填满。

(5)、敏捷就是试错法、产品决策是成功的第一因素、给与产品决策以最大的自由度

6、如果在窗口上面已经加了一个视图,而我又想在这个在窗口加个alertview ,我们怎么办,我们可以重新新建一个窗口,并让这个窗口的水平比当前的窗口windowLevel要高1,但是让新的视图展现在这个上面,等视图消失时去掉这个alertWindow

 

Not Running:未运行。
Inactive:前台非活动状态。处于前台,但是不能接受事件处理。
Active:前台活动状态。处于前台,能接受事件处理。
Background:后台状态。进入后台,如果又可执行代码,会执行代码,代码执行完毕,程序进行挂起。
Suspended:挂起状态。进入后台,不能执行代码,如果内存不足,程序会被杀死。

我的app—公开测试

 

第二次学习:

1、mininumInteritemSpacing  不同item之间的间距

等同于这个代理方法minimumInteritemSpacingForSectionAtIndex

2、minimumLineSpacing 这是最小的列间距

等同于代理方法minimumLineSpacingForSectionAtIndex

3、在collection view中也能让cell 自适应内容大小,如果UICollevtionView的layout是一个UICollectionViewFlowLayout,只需要将layout.itemsize = …m,改成layout.estimatedItemSize = …..只要设置了layout 的estimatedItemISize,collection view就能根据cell里面的autolayout约束去确定cell的大小

4、scorllDirection,滑动方向,有水平和垂直两个方向

5、UICollectionViewFlowLayout 里面的代理方法和属性是非常匹配的。

6、viewForSupplementaryElementOfKind 这个方法用来创建UICollectionView的顶部和底部视图,一般来说,这个kind有系统的标识符,如果没有用特定的布局方式就用系统的标识符kind

7、indexTitlesForCollectionView

这些方法是给tv用的

下面笔记的链接

https://juejin.im/entry/580f21d9da2f60004f42a9f8

8、即使 UICollectionView 已经是一个拥有很高性能的控制器,Apple 仍没有停止优化它。最令人感兴趣的新特性之一,就是对于大量沉重的数据源时 collection views 表现性能的提高。

9、获得高性能 collection views 的诀窍是让 cellForItemAtIndexPath 方法尽快的返回一个 cell,但这可能并不容易。比如异步加载图片这样的技术会有一些帮助,但并足以称之为灵丹妙药。

10、为了能及时地传递 cell,当 collection view 的滚动速度将要超过 cellForItemAtIndexPaths 的能力时,collection view 会调用 prefetchItemsAtIndexPaths 方法

11、Collection view 传递了以后可能需要的 cell 的 NSIndexPaths 数组,这使你有机会去更新 collection view 的基础数据源。例如,如果你的数据源是一个图片 数组,你可以在这个方法中提前调用网络下载这些图片并把他们插入到数据源中,这样他们就可以直接被 cellForItemsAtIndexPaths 方法使用了

12、第二个方法通常在滚动方向发生改变的时候被调用。这么做的原因是:你可能在一些 cell 显示之前就已经提前加载好了数据,如果此时界面反向滚动他们就不是即将现实的状态了,所以你可以取消任何正在进行的数据源更新操作。同样,上面讨论的这些 cell 的 NSIndexPaths 也会作为一个 数组 传递。

13、shouldHighlightItemAtIndexPath

很多UITableView中的效果在UICollectionView没有特定的属性,比如选中效果。

这个方法设置好后,可以完成做很多事了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值