在开发中经常使用这两个属性,但是一直没有去真正理解,导致了好多情况把自己弄晕了,所以这次决定,花点时间去查一下,两者的区别
举个栗子1:
在storyboard中拖入一个view, 然后用代码创建一个imageView, 让其加入到view中
代码如下:
var image =UIImage(named:"a")
var imageView =UIImageView(image: image)
imageView.frame=view.frame
view.addSubview(imageView)
效果如下
打印view的frame 和 bounds 如下
(165.0,184.0,200.0,200.0)
(0.0,0.0,200.0,200.0)
经过网上查询,
于是改成下面这样
var image =UIImage(named:"a")
var imageView =UIImageView(image: image)
imageView.frame=view.bounds
view.addSubview(imageView)
得到了正常的效果
下面我们来分析一下,frame是以父视图左上角位置为(0,0)点, 而bounds是以自身的左上角为(0.0)点算起
第一种情况之所以会跑偏, 是因为我们设置imageview.frame = view.frame
刚才说了frame是以父视图(0,0)为起点, 之前打印的view frame为(165,184,200,200),
这就意味着imageview是起点是以父视图view的(0,0)为起点,偏移165,184), 所以就跑偏了,
第二种情况,我们把imageview.frame = view.bounds, 而bounds是以自身的左上角为(0.0)点算起, 打印出view 的bounds为(0,0,200,200), 这样,imageview的起点就是以父视图(0,0)为起点,偏移(0,0), 这样就正好坐落在父视图的区域中了。
网友评论
bound表示的view坐标位置及大小是基于这个view自己的坐标系的。
牢记这两句话。之后推导看属于哪种情况?
但是这个view刚开始会误认为是UIViewController的根view,但其实你这里的view是绿色视图。希望下次说明一下。
View有两个属性:frame和bound.
frame表示的view坐标位置及大小是基于父坐标系的。
bound表示的view坐标位置及大小是基于这个view自己的坐标系的。
如果使用frame属性,那必须小心,这些值是表示子视图在父视图中的位置,包括旋转和缩放。
这意味着使用self.view.bounds.size可以相对可靠的获得一个视图控制器的视图尺寸。
http://liaogang.github.io/tech/2014/11/28/%E4%BD%A0%E5%8F%AF%E8%83%BD%E4%B8%8D%E7%9F%A5%E9%81%93frames%E5%92%8Cbounds/