如何在Roblox Studio中获取缩放后图像/框架的渲染显示尺寸
嘿,我完全懂你碰到的这个困扰!当所有元素都靠Scale属性和UIAspectRatioConstraint来做自适应缩放时,直接去读常规的frame或者bounds经常拿不到当前实际显示的尺寸,这确实会给定位标记带来麻烦。下面给你几个实用的解决思路:
获取缩放后框架/图像的实际显示尺寸
方法1:强制布局更新后读取bounds
UIKit的布局更新很多时候是异步执行的,所以先确保布局已经彻底完成,再去拿尺寸才准确:
- 先调用目标框架的
layoutIfNeeded()方法,强制系统立即完成当前的布局计算 - 之后通过
yourTargetFrame.bounds.size.width和yourTargetFrame.bounds.size.height就能拿到当前屏幕上实际显示的宽高了
小提示:如果是在
viewDidLoad里执行这段代码,大概率布局还没完成,建议把逻辑放到viewDidLayoutSubviews、viewDidAppear里,或者在你确定布局已经更新完成的时机调用。
方法2:结合UIAspectRatioConstraint和父视图尺寸计算
既然框架上挂了UIAspectRatioConstraint,我们可以利用这个约束的比例值,结合父视图的实际尺寸来推导:
// 先拿到宽高比约束的比例值(比如16:9的话就是16/9) let aspectRatio = yourAspectRatioConstraint.multiplier // 假设框架的宽度是跟随父视图缩放的,先算实际宽度 let parentWidth = yourTargetFrame.superview?.bounds.size.width ?? 0 let actualWidth = parentWidth * yourTargetFrame.transform.scale.x // 再用宽高比算出实际高度 let actualHeight = actualWidth / aspectRatio
如果是高度由父视图决定,就反过来用父视图高度乘以比例得到宽度就行。
方法3:针对UIImageView的专属计算
如果你的图像是放在UIImageView里的,还可以结合原始图像的尺寸来算实际显示尺寸:
guard let originalImageSize = yourImageView.image?.size else { return } // 拿到图像视图的缩放比例 let scaleFactor = yourImageView.transform.scale.x // 先拿到视图的约束宽度,再乘以缩放比例得到实际显示宽度 let constrainedViewWidth = yourImageView.bounds.size.width * scaleFactor // 结合原始图像的宽高比,算出实际显示高度 let actualDisplayHeight = constrainedViewWidth / (originalImageSize.width / originalImageSize.height) // 最终实际显示的宽高就是constrainedViewWidth和actualDisplayHeight
定位标记到指定位置
拿到实际宽高后,假设你要把标记放在图像的相对位置(比如X是原始图像宽度的30%,Y是原始高度的50%),可以这样计算绝对坐标:
// 这里的xRatio和yRatio是0到1之间的比例值,对应相对位置 let xRatio: CGFloat = 0.3 let yRatio: CGFloat = 0.5 // 计算标记的绝对位置 let markerX = yourTargetFrame.frame.origin.x + (actualWidth * xRatio) let markerY = yourTargetFrame.frame.origin.y + (actualHeight * yRatio) // 把标记的位置设置过去,比如用center yourMarkerView.center = CGPoint(x: markerX, y: markerY)
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

