2016-06-14 47 views
1

我在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

+0

plusLayer.frame = CGRectMake(x,y,CGFloat(27),CGFloat(27))是否有效? –

+0

您確定此代碼可以與Swift 2一起使用嗎?我無法得到它編譯 - 你不能分配一個元組到一個結構。使用初始化CGRect(x:x,y:y,寬度:27,高度:27)' – Hamish

回答

3

此行plusLayer.frame = (x, y, 27, 27)

應該是 plusLayer.frame = (x, y, 27 as CGFloat, 27 as CGFloat)

這是因爲CGRect初始化期望4個數字用相同類型的。看看Xcode的建議: enter image description here

+0

這給出了這個錯誤:無法指定 '(CGFloat,CGFloat,(CGFloat),(CGFloat)) '(又名'(CGFloat,CGFloat,CGFloat,CGFloat)')鍵入'CGRect' –

+0

@MatthijsOtterloo我修改了我的答案以提供正確的解決方案和解釋。 – BalestraPatrick

2

你需要的27(一Int類型)顯式轉換到CGFloat

plusLayer.frame = (x, y, 27 as CGFloat, 27 as CGFloat) 
0

作爲一個老開發人員,讓我們做一些清晰:

一)鑄造是一些語言的強大功能,但必須詳細瞭解

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是一個雙。

我的兩毛錢。