Swift'te CGRectMake, CGPointMake, CGSizeMake, CGRectZero, CGPointZero kullanılamıyor


242

Kodu en son swift 3.0'a dönüştürdükten sonra bu hatayı gösterdim.

resim açıklamasını buraya girinresim açıklamasını buraya girin

Ayrıca bana çözüm söyle CGSize = CGSizeMake(0,0)

static var frameAtStartOfPan: CGRect = CGRectZero
static var startPointOfPan: CGPoint = CGPointZero

Bu da mevcut değil.


Ama önceki kodumu swift3'e dönüştürdükten sonra bu sorunu aldım, güncellenmiş versiyonda sözdiziminde herhangi bir değişiklik olup olmadığını bilmek istiyorum
— niravdesai21

Yanıtlar:


493

CGRectAşağıda verilen bir CGPointveya CGSize, örneği kullanılarak kolayca oluşturulabilir .

let rect = CGRect(origin: CGPoint(x: 0,y :0), size: CGSize(width: 100, height: 100))  

// Or

let rect = CGRect(origin: .zero, size: CGSize(width: 100, height: 100))

Veya CGFloatya Doubleda ya da içindeki her bir değeri belirtmek istiyorsak Int, bu yöntemi kullanabiliriz.

let rect = CGRect(x: 0, y: 0, width: 100, height: 100) // CGFloat, Double, Int

CGPoint Bu şekilde oluşturulabilir.

 let point = CGPoint(x: 0,y :0) // CGFloat, Double, Int

CGSize Bu şekilde oluşturulabilir.

let size = CGSize(width: 100, height: 100) // CGFloat, Double, Int

Ayrıca boyut olarak 0 ile nokta ve değerler, bu şekilde yapılabilir.

let size = CGSize.zero // width = 0, height = 0
let point = CGPoint.zero // x = 0, y = 0, equal to CGPointZero
let rect = CGRect.zero // equal to CGRectZero

CGRectZeroVe CGPointZeroyerini CGRect.zerove CGPoint.zerode Swift 3.0.


Ayrıca hızlı 3'te woking değil CGSize = CGSizeMake (0,0) için çözüm söyleyebilir misiniz
— niravdesai21

@ niravdesai21 Soruyu güncelledi, lütfen kontrol edin.

CGPointZero ve CGRectZero da bunun için herhangi bir çözüm mevcut değil mi? Güncellenmiş Soru lütfen cevabı güncelleyin
— niravdesai21

@ niravdesai21 Güncellendi.

4
Aslında CGRect.zero bir sözdizimi değişikliği bir şaka olduğunda "CGRectZero Swift kullanılamaz"! Bu adamların derleme uyarıları üzerinde büyük zaman çalışması gerekiyor ... Onlar sürekli kefalet için Stack Overflow güveniyor
— Magoo

49

İçin hızlı düzeltme CGRectMake, CGPointMake, CGSizeMake içinde swift3 & iOS10

Bu uzantıları ekleyin:

extension CGRect{
    init(_ x:CGFloat,_ y:CGFloat,_ width:CGFloat,_ height:CGFloat) {
        self.init(x:x,y:y,width:width,height:height)
    }

}
extension CGSize{
    init(_ width:CGFloat,_ height:CGFloat) {
        self.init(width:width,height:height)
    }
}
extension CGPoint{
    init(_ x:CGFloat,_ y:CGFloat) {
        self.init(x:x,y:y)
    }
}

Daha sonra "gidin bulun ve Workspace Değiştir " Bul CGRectMake, CGPointMake, CGSizeMake ve onları değiştirin CGRect, CGPoint, CGSize

Xcode şu anda Swift 2+' den Swift 3'e hızlı bir dönüşüm sağlamadığımız için bu adımlar her zaman kaydedilebilir.


Mükemmel çözüm!
— Oprimus

@Oprimus umrunuzu azaltır :)
— Rafat touqir Rafsun

26

Swift 3'te, sadece kullanabilir CGPoint.zeroveya CGRect.zeroyerine CGRectZeroya CGPointZero.

Ancak, Swift 4'te CGRect.zerove 'CGPoint.zero'çalışacak


1
@ChewieTheChorkie haklısın "tek" kelime yarattı karışıklık bunu kaldırdım.
— guru

12

Bunları hızlı 2'de kullanmak istiyorsanız, bu işlevleri kullanabilirsiniz:

CGRectMake için:

func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect {
    return CGRect(x: x, y: y, width: width, height: height)
}

CGPointMake için:

func CGPointMake(_ x: CGFloat, _ y: CGFloat) -> CGPoint {
    return CGPoint(x: x, y: y)
}

CGSizeMake için:

func CGSizeMake(_ width: CGFloat, _ height: CGFloat) -> CGSize {
    return CGSize(width: width, height: height)
}

Sadece herhangi bir sınıfın dışına koyun ve işe yarayacak. (En azından benim için çalışıyor)


9

Çekirdek Grafikler ve diğer API'lardaki yapıların yanı sıra diğer tüm semboller daha temiz hale geldi ve ayrıca parametre adları içeriyor. https://developer.apple.com/reference/coregraphics#symbols

CGRect(x: Int, y: Int, width: Int, height: Int)
CGVector(dx: Int, dy: Int)
CGPoint(x: Double, y: Double)
CGSize(width: Int, height: Int)

CGPoint Örneği:

let newPoint = stackMid.convert(CGPoint(x: -10, y: 10), to: self)

CGVector Örneği:

self.physicsWorld.gravity = CGVector(dx: 0, dy: gravity)

CGSize Örneği:

hero.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 16, height: 18))

CGRect Örneği:

let back = SKShapeNode(rect: CGRect(x: 0-120, y: 1024-200-30, width: 240, height: 140), cornerRadius: 20)

Apple Blogu

Swift 3'teki Swift sözdizimi ve API yeniden adlandırma değişiklikleri, dili daha doğal hissettirir ve Kakao çerçevelerini çağırırken daha da hızlı bir Swift-y deneyimi sağlar. Popüler çerçeveler Core Graphics ve Grand Central Dispatch, Swift'te yeni, çok daha temiz arayüzlere sahip.


5

Takip etmeyi dene:

var myToolBar = UIToolbar.init(frame: CGRect.init(x: 0, y: 0, width: 320, height: 44))

Bu swift'in en son sürümü için


beğen (Y), bu otomatik tamamlama için daha kolay olurdu
— Husam

5

Swift 3 Bonus: Neden kimse kısa formdan bahsetmedi?

CGRect(origin: .zero, size: size)

.zero onun yerine CGPoint.zero

Tür tanımlandığında, güvenle atlayabilirsiniz.


2

Bunu CGRectZero'nun değiştirilmesi ile kullanabilirsiniz

CGRect.zero

0

Swift 4'te aşağıdaki gibi çalışır

collectionView.setContentOffset(CGPoint.zero, animated: true)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.