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

使用CGRect.insetBy报错:类型'(CGFloat, CGFloat)->CGRect'无origin成员

解决CGRect.insetBy调用报错的问题

嘿,我看到你在使用CGRect.insetBy(dx:dy:)时遇到了这个棘手的报错,咱们来一步步拆解问题并修复它。

错误原因分析

报错信息Value of type '(CGFloat, CGFloat) -> CGRect' has no member 'origin'说明:你的newRect变量并没有被赋值为CGRect实例,而是被当成了一个方法引用(函数类型)。这通常是因为方法调用的语法有误,或者混淆了实例方法和类型方法的使用逻辑。

具体看你的代码:

  1. 虽然rect.insetBy(dx:..., dy:...)理论上是正确的实例方法调用,但可能因Swift版本差异或语法细节问题,导致编译器没有正确识别为"调用方法并返回实例"的行为。
  2. 后面的CGRect.offsetBy(resultRect, offset.x , offset.y)也犯了同样的错误:offsetBy是CGRect的实例方法,必须通过CGRect实例调用,不能直接用CGRect类型调用。

修正后的代码

func scaleRect(rect: CGRect, xScale: CGFloat, yScale: CGFloat, offset: CGPoint) -> CGRect { 
    let width = rect.width 
    let height = rect.height 
    let scaleUp: CGFloat = 2.0 
    // 简化新尺寸计算,逻辑和原代码完全一致
    let newWidth = width * sqrt(scaleUp) 
    let newHeight = height * sqrt(scaleUp) 
    // 改用类型方法CGRect.inset(_:dx:dy:),确保返回的是CGRect实例
    let newRect = CGRect.inset(rect, dx: (width - newWidth)/2, dy: (height - newHeight)/2) 
    // 可直接复用newRect,无需重新构造resultRect(除非有特殊需求)
    var resultRect = newRect
    // 改用实例方法offsetBy(dx:dy:)完成偏移
    resultRect = resultRect.offsetBy(dx: offset.x, dy: offset.y) 
    return resultRect 
}

关键修复点

  • 替换insetBy调用:改用类型方法CGRect.inset(_:dx:dy:),明确传入原矩形和偏移量,让编译器清晰识别这是返回CGRect实例的操作,而非方法引用。
  • 修复offsetBy调用:将CGRect.offsetBy(...)改为resultRect.offsetBy(dx:dy:),这才是实例方法的正确调用方式,会返回偏移后的新CGRect。
  • 简化尺寸计算:把sqrt(width * width * scaleUp)简化为width * sqrt(scaleUp),逻辑完全一致,但代码更简洁高效。

如果你坚持想用实例方法insetBy,可以检查Swift版本是否支持该写法,或者确保参数传递时没有漏写dx:/dy:标签(比如写成rect.insetBy((width - newWidth)/2, (height - newHeight)/2)就会导致语法错误)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:17:06