iOS修改父视图Bounds原点为何导致子视图反向移动?
iOS中Bounds修改导致子视图反向偏移的原因
核心逻辑:修改父视图bounds.origin是移动自身坐标系原点,而非父视图位置
你遇到的现象完全符合iOS坐标系规则,问题出在对bounds.origin的理解偏差:
- 默认情况下,视图的bounds.origin为(0,0),代表自身坐标系的原点在视图左上角。
- 当你把viewA的bounds.origin.x设为50时,并没有移动viewA本身在父视图的位置,而是将viewA自己的坐标系原点向右偏移了50个单位。
子视图位置的计算逻辑
子视图的frame是基于父视图的坐标系确定的:
假设viewB在viewA坐标系中的frame为(x,y,w,h),当viewA的坐标系原点右移50后,viewB在屏幕上的实际位置等于「viewA的frame.origin + (viewB.frame.origin - viewA.bounds.origin)」。
由于viewA.bounds.origin.x增加了50,viewB的屏幕位置会向左偏移50,最终呈现出你看到的“子视图左移”效果。
Frame与Bounds的关键区别再明确
- Frame:视图在父视图坐标系中的位置和大小,修改frame会直接改变视图在父视图里的位置。
- Bounds:视图自身坐标系的位置和大小,修改bounds.origin只会调整自身坐标系的原点,进而让所有子视图相对于屏幕的位置反向偏移;修改bounds.size则会缩放视图自身(以及子视图的渲染)。
对应你的代码验证
你执行的代码:
viewA.layer.bounds = CGRectMake(50, 0, 240, 377)
这里修改了bounds.origin.x为50,触发了viewA坐标系原点的右移,所以viewB相对于屏幕的位置自然向左偏移了50个单位。
内容的提问来源于stack exchange,提问作者Santiago
相关产品推荐
相关产品推荐

