CGRectMake, CGPointMake, CGSizeMake, CGRectZero, CGPointZero non è disponibile in Swift


242

Dopo aver convertito il codice nell'ultimo swift 3.0, mi viene mostrato questo errore.

inserisci qui la descrizione dell'immagineinserisci qui la descrizione dell'immagine

Dimmi anche una soluzione per CGSize = CGSizeMake(0,0)

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

Anche questo non è disponibile.


Ma dopo aver convertito il mio codice precedente in swift3 ho riscontrato questo problema, vorrei sapere se ci sono cambiamenti nella sintassi nella versione aggiornata
niravdesai21

Risposte:


493

CGRectPuò essere semplicemente creato usando un'istanza di a CGPointo CGSize, che è data di seguito.

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

O se vogliamo specificare ogni valore in CGFloato Doubleo Int, possiamo usare questo metodo.

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

CGPoint Può essere creato in questo modo.

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

CGSize Può essere creato in questo modo.

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

Anche le dimensioni e il punto con 0 come valori, può essere fatto in questo modo.

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

CGRectZeroe CGPointZerosostituito con CGRect.zero& CGPoint.zeroin Swift 3.0.


Puoi dirmi la soluzione per CGSize = CGSizeMake (0,0) che non si sveglia in 3
niravdesai21

@ niravdesai21 Aggiornata la domanda, si prega di controllare.

CGPointZero e CGRectZero non sono disponibili soluzioni per questo? Domanda aggiornata aggiorna la risposta
niravdesai21

@ niravdesai21 Aggiornato.

4
"CGRectZero non è disponibile in Swift" quando in realtà è una modifica della sintassi a CGRect.zero è uno scherzo! Questi ragazzi hanno bisogno di lavorare sugli avvisi di compilazione alla grande ... Si affidano a Stack Overflow per salvarli costantemente
Magoo,

49

Soluzione rapida per CGRectMake, CGPointMake, CGSizeMake in Swift3 e iOS10

Aggiungi queste estensioni:

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

Quindi vai su " Trova e sostituisci nello spazio di lavoro " Trova CGRectMake, CGPointMake, CGSizeMake e sostituiscili con CGRect, CGPoint, CGSize

Questi passaggi potrebbero risparmiare tutto il tempo poiché Xcode in questo momento non ci offre una conversione rapida da Swift 2+ a Swift 3


Soluzione geniale!
Oprimus,

@Oprimus spero che riduca la seccatura :)
Rafat touqir Rafsun

26

In Swift 3, puoi semplicemente usare CGPoint.zeroo CGRect.zeroal posto di CGRectZeroo CGPointZero.

Tuttavia, in Swift 4, CGRect.zeroe 'CGPoint.zero'funzionerà


1
@ChewieTheChorkie hai ragione la "sola" parola creata confusione che ho rimosso.
guru,

12

Se vuoi usarli come in swift 2, puoi usare queste funzioni:

Per CGRectMake:

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

Per CGPointMake:

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

Per CGSizeMake:

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

Mettili fuori da qualsiasi classe e dovrebbe funzionare. (Funziona almeno per me)


9

Le strutture e tutti gli altri simboli nella Core Graphics e altre API sono diventati più puliti e includono anche i nomi dei parametri. 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)

Esempio CGPoint:

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

Esempio di CGVector:

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

Esempio CGSize:

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

Esempio CGRect:

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

Blog di Apple

La sintassi Swift e le modifiche alla ridenominazione dell'API in Swift 3 rendono il linguaggio più naturale e offrono un'esperienza Swift-y ancora maggiore quando si chiamano framework Cocoa. Framework popolari Core Graphics e Grand Central Dispatch hanno nuove interfacce molto più pulite in Swift.


5

Prova quanto segue:

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

Questo è per la Swift ultima versione


piace (Y), questo sarebbe più facile per il completamento automatico
Husam

5

Swift 3 Bonus: perché nessuno ha menzionato la forma breve?

CGRect(origin: .zero, size: size)

.zero invece di CGPoint.zero

Quando il tipo è definito, puoi tranquillamente ometterlo.



0

In Swift 4 funziona come di seguito

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

0

Per CGSize

CGSize(width: self.view.frame.width * 3, height: self.view.frame.size.height)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.