CGRectMake, CGPointMake, CGSizeMake, CGRectZero, CGPointZero jest niedostępny w Swift

242

Po przekonwertowaniu kodu do najnowszej wersji Swift 3.0 pojawia się ten błąd.

wprowadź opis zdjęcia tutajwprowadź opis zdjęcia tutaj

Powiedz mi również rozwiązanie CGSize = CGSizeMake(0,0)

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

Który jest również niedostępny.

niravdesai21
źródło
Ale po przekonwertowaniu mojego poprzedniego kodu na swift3 dostałem ten problem, chciałbym wiedzieć, czy w zaktualizowanej wersji
pojawi się

Odpowiedzi:

493

CGRectMożna go po prostu utworzyć za pomocą wystąpienia a CGPointlub tego CGSize, które podano poniżej.

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))

Lub jeśli chcemy określić każdą wartość w CGFloatlub Doublelub Int, możemy użyć tej metody.

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

CGPoint Można utworzyć w ten sposób.

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

CGSize Można utworzyć w ten sposób.

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

Również rozmiar i punkt z 0 jako wartości, można to zrobić w ten sposób.

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

CGRectZeroi CGPointZerozastąpiony przez CGRect.zero& CGPoint.zeroin Swift 3.0.


źródło
Czy możesz mi również powiedzieć rozwiązanie dla CGSize = CGSizeMake (0,0), który nie budzi się w szybkim 3
niravdesai21
@ niravdesai21 Zaktualizowano pytanie, sprawdź.
CGPointZero i CGRectZero również nie są dostępne jakieś rozwiązanie? Zaktualizowane pytanie proszę zaktualizować odpowiedź
niravdesai21
@ niravdesai21 Zaktualizowano.
4
„CGRectZero jest niedostępny w Swift”, gdy w rzeczywistości jest to zmiana składni w CGRect.zero to żart! Ci faceci potrzebują do pracy na ich kompilacji ostrzeżeń Big Time ... one polegać na przepełnienie stosu do ratowania ich stale
Magoo
49

Szybka poprawka dla CGRectMake, CGPointMake, CGSizeMake w Swift3 i iOS10

Dodaj te rozszerzenia:

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)
    }
}

Następnie przejdź do „ Znajdź i zamień w obszarze roboczym ” Znajdź CGRectMake, CGPointMake, CGSizeMake i zamień je na CGRect, CGPoint, CGSize

Te kroki mogą oszczędzać cały czas, ponieważ Xcode w tej chwili nie zapewnia nam szybkiej konwersji ze Swift 2+ na Swift 3

Rafat touqir Rafsun
źródło
Genialne rozwiązanie!
Oprimus
@Oprimus mam nadzieję, że zmniejszy to twój
problem
26

W Swift 3 możesz po prostu użyć CGPoint.zerolub CGRect.zerozamiast CGRectZerolub CGPointZero.

Jednak w Swift 4 CGRect.zeroi 'CGPoint.zero'będzie działać

guru
źródło
1
@ChewieTheChorkie masz rację "jedyne" słowo zamieszanie stworzyłem, że to usunąłem.
guru
12

Jeśli chcesz ich używać jak w swift 2, możesz użyć tych funkcji:

W przypadku CGRectMake:

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

W przypadku CGPointMake:

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

W przypadku CGSizeMake:

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

Po prostu umieść je poza klasą i powinno działać. (Działa dla mnie przynajmniej)

CaOs433
źródło
9

Struktury, a także wszystkie inne symbole w Core Graphics i innych interfejsach API stały się bardziej przejrzyste i zawierają także nazwy parametrów. 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)

Przykład CGPoint:

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

Przykład CGVector:

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

Przykład rozmiaru CGS:

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

Przykład CGRect:

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

Blog Apple

Szybka zmiana składni i zmiany nazw API w Swift 3 sprawia, że ​​język wydaje się bardziej naturalny, i zapewnia jeszcze więcej Swift-y podczas wywoływania struktur Cocoa. Popularne frameworki Core Graphics i Grand Central Dispatch mają nowe, znacznie czystsze interfejsy w Swift.

Edison
źródło
5

Spróbuj wykonać następujące czynności:

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

To jest dla najnowszej wersji swift

BurakLGN
źródło
podoba się to (Y), byłoby to łatwiejsze do automatycznego uzupełniania
Husam,
5

Swift 3 Bonus: Dlaczego nikt nie wspomniał o skróconej formie?

CGRect(origin: .zero, size: size)

.zero zamiast CGPoint.zero

Po zdefiniowaniu typu można go bezpiecznie pominąć.

Dmitrij Isaev
źródło
2

Możesz użyć tego z zamiennikiem CGRectZero

CGRect.zero
jaskiratjd
źródło
0

W Swift 4 działa jak poniżej

collectionView.setContentOffset(CGPoint.zero, animated: true)
Neha
źródło
0

Dla CGSize

CGSize(width: self.view.frame.width * 3, height: self.view.frame.size.height)
Zmiana drużyny
źródło