iOS中frame和Bounds之间的区别

frame

  frame是每个view必备的属性,代表的是当前视图的位置和大小,没有设置他,当前视图是看不到的。位置需要有参照物才能确定,数学中我们用坐标系来确定坐标系中的某个点的位置,iOS中有他特有的坐标系,如下图:

【iOS技术文章】详解iOS开发中frame和Bounds之间的区别

iOS坐标系

  • 在iOS坐标系中以左上角为坐标原点,往为X正方向,往是Y正方向

  • frame中的位置是以父视图的坐标系为标准来确定当前视图的位置

  • 同样的默认情况下,本视图的左上角就是子视图的坐标原点

  • 更改frame中位置,则当前视图的位置会发生改变

  • 更改frame的大小,则当前视图以当前视图左上角为基准的进行大小的修改

  bounds

  bounds是每个View都有的属性,这个属性我们一般不进行设置,他同样代表位置和大小;每个视图都有自己的坐标系,且这个坐标系默认以自身的左上角为坐标原点,所有子视图以这个坐标系的原点为基准点。bounds的位置代表的是子视图看待当前视图左上角的位置;bounds的大小代表当前视图的大小;

  • 更改bounds中的位置对于当前视图没有影响,相当于更改了当前视图的坐标系,对于子视图来说当前视图的左上角已经不再是(0,0), 而是改变后的坐标,坐标系改了,那么所有子视图位置也会跟着改变

  • 更改bounds的大小,bounds的大小代表当前视图的长和宽,修改长宽后,中心点继续保持不变, 长宽进行改变;通过bounds修改长宽看起来就像是以中心点为基准点对长宽两边同时进行缩放;

  frame和bounds

  有如下图:

【iOS技术文章】详解iOS开发中frame和Bounds之间的区别

iOS bounds

  

  View A是最顶层视图, 因此他的信息如下:frame origin:0, 0 size :550 * 400

  bounds origin:0, 0 size 550 * 400

  因为是View A是顶层视图,所以其实相当于覆盖在框架上,因此位置从父视图的(0, 0)开始,大小为550*400默认情况下,本视图的坐标系是没有发生改变的即当前视图(view A)的左上角就是所有子视图的原点,大小就是当前视图的大小.

  View B是View A的子视图,因此他的信息如下: frame origin:200, 100 size :200 * 250

  bounds origin:0, 0 size :200 * 250

  因为View B是View A的子视图,所以View B的frame位置需要以View A的左上角为参照,因此位置为(200, 100), 大小为200*250bounds在默认情况下本视图的坐标系是没有发生改变的即当前视图(view B)的左上角就是当前视图所有子视图的原点.

  上面这种是普通的情况,也就是没有更改bounds的时候,下面我们来看更改bounds的例子, 如下图:

【iOS技术文章】详解iOS开发中frame和Bounds之间的区别

iOS bounds

  

  在上一个例子的基础上,我们更改了view A的bounds后,view B看待View A的左上角就已经发生改变了;这个时候我们看待View A的左上角就不是坐标原点了,而是我们通过bounds设置后的坐标,如图也就是(0, 100);在View B的frame没有保存不变的基础上,我们View B的位置向上移动了100

  在第一例的基础上,更改了bounds中X后,效果图如下:

【iOS技术文章】详解iOS开发中frame和Bounds之间的区别

iOS bounds 3

  总结

  1、frame不管对于位置还是大小,改变的都是自己本身

  2、frame的位置是以父视图的坐标系为参照,从而确定当前视图在父视图中的位置

  3、frame的大小改变时,当前视图的左上角位置不会发生改变,只是大小发生改变

  1、bounds改变位置时,改变的是子视图的位置,自身没有影响;其实就是改变了本身的坐标系原点,默认本身坐标系的原点是左上角

  2、bounds的大小改变时,当前视图的中心点不会发生改变,当前视图的大小发生改变,看起来效果就像缩放一样。

  

  转自:http://www.lanou3g.com/lozx/2582.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使 iOS 瀑布流的 cell 完全展示在屏幕,您需要做到以下几点: 1. 设置 UICollectionView 的 contentInset 属性,以便 cell 与屏幕边缘之间有足够的间距。 2. 在 UICollectionViewDelegateFlowLayout 协议的方法,设置每个 section 的 inset。 3. 在 UICollectionViewDelegateFlowLayout 协议的方法,确定每个 cell 的大小。 4. 在 UICollectionViewDelegate 协议的方法,使用 indexPathsForVisibleItems 属性获取当前可见的 cell。 5. 对于每个可见的 cell,使用 rectForItem(at:) 方法获取其在 UICollectionView frame。 6. 使用 CGRectContainsRect() 方法检查 cell 的 frame 是否完全包含在屏幕。如果是,则 cell 完全展示在屏幕;如果不是,则需要调整 UICollectionView 的 contentOffset 属性以确保 cell 完全展示在屏幕。 以下是代码示例: ```swift func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { let visibleCells = collectionView.indexPathsForVisibleItems for visibleIndexPath in visibleCells { if let visibleCell = collectionView.cellForItem(at: visibleIndexPath) { let cellFrame = collectionView.convert(visibleCell.frame, to: collectionView.superview) let screenFrame = UIScreen.main.bounds if !CGRectContainsRect(screenFrame, cellFrame) { let offsetY = max(0, cellFrame.maxY - screenFrame.maxY) collectionView.setContentOffset(CGPoint(x: 0, y: collectionView.contentOffset.y + offsetY), animated: true) } } } } ``` 注意,这只是一个示例代码,具体实现可能因您的需求而异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值