Swift 3 GCFloat到GCRect
我在Swift项目中使用了这段代码。 下面的代码工作得很好斯威夫特2,但似乎并没有在斯威夫特3不再工作,它提供了以下错误:Swift 3 GCFloat到GCRect
无法指定类型的值“(CGFloat的,CGFloat的,INT,INT)”到类型'的CGRect'
if plusLayer == nil {
plusLayer = CALayer()
let halfWidth: CGFloat = self.bounds.size.width/2
let halfHeight: CGFloat = self.bounds.size.height/2
let ds: CGFloat = sqrt(halfWidth * halfWidth/2)
let x: CGFloat = halfWidth + ds - 27/2
let y: CGFloat = halfHeight - ds - 27/2
plusLayer.frame = (x, y, 27, 27)
plusLayer.contentsGravity = kCAGravityResizeAspectFill
if let i = plusSignImage {
plusLayer.contents = i.cgImage
} else {
plusSignImage = UIImage(named: "PlusSign", in: Bundle(for: self.dynamicType), compatibleWith: UITraitCollection(displayScale: UIScreen.main().scale))
plusLayer.contents = plusSignImage!.cgImage
}
layer.addSublayer(plusLayer)
}
任何人都知道如何解决这个问题呢?帮助,真的很感激!
谢谢! :d
此行plusLayer.frame = (x, y, 27, 27)
应该是 plusLayer.frame = (x, y, 27 as CGFloat, 27 as CGFloat)
这给出了这个错误:无法指定 '(CGFloat,CGFloat,(CGFloat),(CGFloat)) '(又名'(CGFloat,CGFloat,CGFloat,CGFloat)')键入'CGRect' –
@MatthijsOtterloo我修改了我的答案以提供正确的解决方案和解释。 – BalestraPatrick
你需要的27(一Int
类型)显式转换到CGFloat
:
plusLayer.frame = (x, y, 27 as CGFloat, 27 as CGFloat)
作为一个老开发人员,让我们做一些清晰:
一)铸造是一些语言的强大功能,但必须详细了解
b)我们可以使用“as”进行投射,但与CGFloat(xx)
c)“as”必须用于对象的类型转换。 (参见: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html ) d)CGRectMake做工作迅速2.X/7.3的Xcode
五)不投翻一番,只需使用:
let r = CGRect(x: 10, y: 20, width: 30, height: 40)
编译器会明白其中的这些方法请拨打:
public init(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat)
public init(x: Double, y: Double, width: Double, height: Double)
public init(x: Int, y: Int, width: Int, height: Int)
并且会叫第3个。
,如果你写:
let d = 10.0
let r2 = CGRect(x: d, y: 20, width: 30, height: 40)
它会调用2,如d是一个双。
我的两毛钱。
plusLayer.frame = CGRectMake(x,y,CGFloat(27),CGFloat(27))是否有效? –
您确定此代码可以与Swift 2一起使用吗?我无法得到它编译 - 你不能分配一个元组到一个结构。使用初始化CGRect(x:x,y:y,宽度:27,高度:27)' – Hamish