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.