CGRectMake, CGPointMake, CGSizeMake, CGRectZero, CGPointZero n'est pas disponible dans Swift

242

Après avoir converti le code vers le dernier swift 3.0, cette erreur s'affiche.

entrez la description de l'image icientrez la description de l'image ici

Dites-moi aussi une solution pour CGSize = CGSizeMake(0,0)

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

Ce qui est également indisponible.

niravdesai21
la source
Mais après avoir converti mon code précédent en swift3, j'ai eu ce problème, je voudrais savoir s'il y a un changement de syntaxe dans la version mise à jour
niravdesai21

Réponses:

493

CGRectPeut être simplement créé en utilisant une instance d'un CGPointou CGSize, c'est donné ci-dessous.

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

Ou si nous voulons spécifier chaque valeur dans CGFloatou Doubleou Int, nous pouvons utiliser cette méthode.

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

CGPoint Peut être créé comme ça.

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

CGSize Peut être créé comme ça.

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

Taillez et pointez avec 0 comme valeurs, cela peut être fait comme ceci.

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

CGRectZero& CGPointZeroremplacé par CGRect.zero& CGPoint.zeroin Swift 3.0.


la source
Pouvez-vous également me dire une solution pour CGSize = CGSizeMake (0,0) qui ne se réveille pas dans swift 3
niravdesai21
@ niravdesai21 Mise à jour de la question, veuillez vérifier.
CGPointZero et CGRectZero n'est également pas disponible aucune solution pour cela? Question mise à jour, veuillez mettre à jour la réponse
niravdesai21
@ niravdesai21 Mis à jour.
4
"CGRectZero n'est pas disponible dans Swift" alors qu'en réalité c'est un changement de syntaxe à CGRect.zero est une blague! Ces gars doivent travailler sur leurs avertissements de compilation en grand temps ... Ils comptent sur Stack Overflow pour les renflouer constamment
Magoo
49

Solution rapide pour CGRectMake, CGPointMake, CGSizeMake dans Swift3 et iOS10

Ajoutez ces extensions:

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

Ensuite, allez dans " Rechercher et remplacer dans l'espace de travail " Recherchez CGRectMake, CGPointMake, CGSizeMake et remplacez-les par CGRect, CGPoint, CGSize

Ces étapes pourraient économiser tout le temps car Xcode ne nous permet pas de convertir rapidement Swift 2+ en Swift 3

Rafat touqir Rafsun
la source
Solution brillante!
Oprimus
@Oprimus espère que cela réduira vos tracas :)
Rafat touqir Rafsun
26

Dans Swift 3, vous pouvez simplement utiliser CGPoint.zeroou CGRect.zeroà la place de CGRectZeroou CGPointZero.

Cependant, dans Swift 4, CGRect.zeroet 'CGPoint.zero'fonctionnera

gourou
la source
1
@ChewieTheChorkie vous avez raison, le "seul" mot a créé de la confusion, j'ai supprimé cela.
gourou
12

Si vous souhaitez les utiliser comme dans swift 2, vous pouvez utiliser ces fonctions:

Pour CGRectMake:

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

Pour CGPointMake:

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

Pour CGSizeMake:

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

Mettez-les juste en dehors de toute classe et ça devrait marcher. (Fonctionne pour moi au moins)

CaOs433
la source
9

Les structures ainsi que tous les autres symboles dans Core Graphics et d'autres API sont devenus plus propres et incluent également des noms de paramètres. 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)

Exemple CGPoint:

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

Exemple de CGVector:

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

Exemple CGSize:

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

Exemple CGRect:

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

Blog Apple

La syntaxe Swift et les changements de changement de nom d'API dans Swift 3 rendent le langage plus naturel et offrent une expérience Swift-y encore plus lors de l'appel des frameworks Cocoa. Les frameworks populaires Core Graphics et Grand Central Dispatch ont de nouvelles interfaces beaucoup plus propres dans Swift.

Edison
la source
5

Essayez ce qui suit:

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

Ceci est pour la dernière version du swift

BurakLGN
la source
comme ça (Y), ce serait plus facile pour la complétion automatique
Husam
5

Swift 3 Bonus: Pourquoi personne n'a-t-il mentionné la forme courte?

CGRect(origin: .zero, size: size)

.zero au lieu de CGPoint.zero

Lorsque le type est défini, vous pouvez l'omettre en toute sécurité.

Dmitry Isaev
la source
2

Vous pouvez l'utiliser avec le remplacement de CGRectZero

CGRect.zero
jaskiratjd
la source
0

Dans Swift 4, cela fonctionne comme ci-dessous

collectionView.setContentOffset(CGPoint.zero, animated: true)
Neha
la source
0

Pour CGSize

CGSize(width: self.view.frame.width * 3, height: self.view.frame.size.height)
Changement d'équipe
la source