CGRectMake, CGPointMake, CGSizeMake, CGRectZero, CGPointZero no está disponible en Swift

242

Después de convertir el código a la última versión de swift 3.0, aparece este error.

ingrese la descripción de la imagen aquíingrese la descripción de la imagen aquí

También dime solución para CGSize = CGSizeMake(0,0)

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

Que tampoco está disponible.

niravdesai21
fuente
Pero después de convertir mi código anterior a swift3, obtuve este problema, me gustaría saber si hay algún cambio en la sintaxis en la versión actualizada
niravdesai21

Respuestas:

493

CGRectSe puede crear simplemente usando una instancia de a CGPointo CGSize, eso se da a continuación.

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 si queremos especificar cada valor de CGFloato Double, o Int, podemos utilizar este método.

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

CGPoint Se puede crear así.

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

CGSize Se puede crear así.

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

También tamaño y punto con 0 como valores, se puede hacer así.

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& CGPointZeroreemplazado con CGRect.zero& CGPoint.zeroin Swift 3.0.


fuente
¿Me puede decir también la solución para CGSize = CGSizeMake (0,0) que no funciona en swift 3
niravdesai21
@ niravdesai21 Actualizó la pregunta, por favor verifique.
CGPointZero y CGRectZero tampoco están disponibles ¿alguna solución para eso? Pregunta actualizada por favor actualice la respuesta
niravdesai21
@ niravdesai21 Actualizado.
44
"CGRectZero no está disponible en Swift" cuando en realidad es un cambio de sintaxis a CGRect.zero ¡es una broma! Estos muchachos necesitan trabajar en sus advertencias de compilación a lo grande ... Confían en Stack Overflow para rescatarlos constantemente
Magoo
49

Solución rápida para CGRectMake, CGPointMake, CGSizeMake en Swift3 y iOS10

Agregue estas extensiones:

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

Luego, vaya a " Buscar y reemplazar en el área de trabajo " Encuentre CGRectMake, CGPointMake, CGSizeMake y reemplácelos con CGRect, CGPoint, CGSize

Estos pasos pueden ahorrar todo el tiempo ya que Xcode en este momento no nos da una conversión rápida de Swift 2+ a Swift 3

Rafat touqir Rafsun
fuente
¡Solución brillante!
Oprimus
@Oprimus espero que reduzca su molestia :)
Rafat touqir Rafsun
26

En Swift 3, simplemente puede usar CGPoint.zeroo CGRect.zeroen lugar de CGRectZerooCGPointZero .

Sin embargo, en Swift 4, CGRect.zeroy 'CGPoint.zero'funcionará

gurú
fuente
1
@ChewieTheChorkie tienes razón, la "única" palabra creó confusión. He eliminado eso.
guru
12

Si desea usarlos como en swift 2, puede usar estas funciones:

Para CGRectMake:

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

Para CGPointMake:

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

Para CGSizeMake:

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

Simplemente colóquelos fuera de cualquier clase y debería funcionar. (Funciona para mí al menos)

CaOs433
fuente
9

Las estructuras, así como todos los demás símbolos en Core Graphics y otras API, se han vuelto más limpios y también incluyen nombres de parámetros. 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)

Ejemplo de CGPoint:

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

Ejemplo de CGVector:

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

Ejemplo de CGSize:

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

Ejemplo de CGRect:

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

Blog de Apple

La sintaxis de Swift y los cambios de cambio de nombre de API en Swift 3 hacen que el lenguaje se sienta más natural y brindan una experiencia Swift-y aún más cuando se llaman frameworks Cocoa. Los marcos populares Core Graphics y Grand Central Dispatch tienen interfaces nuevas y mucho más limpias en Swift.

Edison
fuente
5

Intenta lo siguiente:

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

Esto es para el de SWIFT versión más reciente

BurakLGN
fuente
me gusta (S), esto sería más fácil para la finalización automática
Husam
5

Bono Swift 3: ¿Por qué nadie mencionó la forma corta?

CGRect(origin: .zero, size: size)

.zero en vez de CGPoint.zero

Cuando se define el tipo, puede omitirlo de forma segura.

Dmitry Isaev
fuente
2

Puede usar esto con el reemplazo de CGRectZero

CGRect.zero
jaskiratjd
fuente
0

En Swift 4 funciona como a continuación

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

Para CGSize

CGSize(width: self.view.frame.width * 3, height: self.view.frame.size.height)
Equipo chang
fuente