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.


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.


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


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ć


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)


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.


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


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ąć.



0

W Swift 4 działa jak poniżej

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.