You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI:如何让矩形在带自定义锚点缩放的视图中居中?

解决办法

要让绿色矩形不管怎么调缩放、偏移,都稳稳待在ContainerView(就是那个黄色背景的100×100视图)中心,按下面两步改就行:

1. 先把修饰符顺序理对(这步不能少)

SwiftUI里修饰符的顺序直接影响布局结果,你原来的代码把frame放在了scaleEffect和offset后面,导致缩放和偏移都是作用在默认大小的矩形上,不是你要的350×350的矩形。得把frame移到最前面:

Rectangle()
    .fill(.green)
    .frame(width: 500 * 0.7, height: 500 * 0.7) // 先把矩形尺寸定好
    .scaleEffect(i.scale, anchor: .center) // 明确指定以中心为缩放锚点,这样缩放时中心不会跑
    .offset(x: i.frame.origin.x, y: i.frame.origin.y)

2. 加个补偿偏移,抵消自定义偏移并居中

绿色矩形默认是350×350,比innerContainerView大很多,默认是左上角对齐的,得加个偏移让它中心和innerContainerView的中心对上,同时还要抵消你自己设的i.frame.origin偏移。直接在原来的offset后面再加一段:

.offset(x: -125 - i.frame.origin.x, y: -125 - i.frame.origin.y)

这里的-125是算出来的固定值:innerContainerView中心是(50,50),绿色矩形中心是(175,175),所以需要往左上移125个单位才能对齐中心。而-i.frame.origin.x/y刚好能抵消你自己设的偏移,不管你给i.frame.origin设什么值,都会被抵消掉,最后矩形只会保持在中心位置。

改完后的绿色矩形完整代码

Rectangle()
    .fill(.green)
    .frame(width: 500 * 0.7, height: 500 * 0.7)
    .scaleEffect(i.scale, anchor: .center)
    .offset(x: i.frame.origin.x, y: i.frame.origin.y)
    .offset(x: -125 - i.frame.origin.x, y: -125 - i.frame.origin.y)

补充说明

  • 如果之后你把缩放锚点改成非中心的位置,还得额外算锚点偏移带来的位置变化,再加对应的补偿量;
  • ContainerView外层的scaleEffect(fscale)和offset(foffset)是对整个黄色视图的变换,绿色矩形会跟着黄色视图一起动,始终保持相对黄色视图的中心位置不变。

内容的提问来源于stack exchange,提问作者MG1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:55:18