使用CGRect.insetBy报错:类型'(CGFloat, CGFloat)->CGRect'无origin成员
解决
CGRect.insetBy调用报错的问题 嘿,我看到你在使用CGRect.insetBy(dx:dy:)时遇到了这个棘手的报错,咱们来一步步拆解问题并修复它。
错误原因分析
报错信息Value of type '(CGFloat, CGFloat) -> CGRect' has no member 'origin'说明:你的newRect变量并没有被赋值为CGRect实例,而是被当成了一个方法引用(函数类型)。这通常是因为方法调用的语法有误,或者混淆了实例方法和类型方法的使用逻辑。
具体看你的代码:
- 虽然
rect.insetBy(dx:..., dy:...)理论上是正确的实例方法调用,但可能因Swift版本差异或语法细节问题,导致编译器没有正确识别为"调用方法并返回实例"的行为。 - 后面的
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
相关产品推荐
相关产品推荐

