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.