CGRectMake, CGPointMake, CGSizeMake, CGRectZero, CGPointZero não está disponível no Swift


242

Depois de converter o código para o mais recente swift 3.0, este erro é mostrado.

insira a descrição da imagem aquiinsira a descrição da imagem aqui

Diga-me também a solução para CGSize = CGSizeMake(0,0)

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

O que também está indisponível.


Mas depois de converter o meu código anterior para swift3 eu tenho esta questão, gostaria de saber se há alguma mudança na sintaxe na versão atualizada
niravdesai21

Respostas:


493

CGRectPode ser simplesmente criado usando uma instância de a CGPointou CGSize, dada abaixo.

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, se quisermos especificar cada valor em CGFloatou Doubleou Int, podemos usar esse método.

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

CGPoint Pode ser criado assim.

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

CGSize Pode ser criado assim.

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

Também dimensione e aponte com 0 como valores, isso pode ser feito assim.

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& CGPointZerosubstituído por CGRect.zero& CGPoint.zeroin Swift 3.0.


Você pode também dizer-me solução para CGSize = CGSizeMake (0,0) que não é woking em Swift 3
niravdesai21

@ niravdesai21 Atualizou a pergunta, verifique.

O CGPointZero e o CGRectZero também não estão disponíveis. Pergunta atualizada, por favor, atualize a resposta
niravdesai21 /

@ niravdesai21 Atualizado.

4
"CGRectZero não está disponível no Swift" quando na verdade é uma alteração de sintaxe para CGRect.zero é uma piada! Esses caras precisam para trabalhar em seus avisos de compilação grande tempo ... Eles contam com estouro de pilha para socorrê-los constantemente
Magoo

49

Correção rápida para CGRectMake, CGPointMake, CGSizeMake no Swift3 e iOS10

Adicione estas extensões:

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

Em seguida, vá para " Localizar e substituir na área de trabalho " Encontre CGRectMake, CGPointMake, CGSizeMake e substitua-os por CGRect, CGPoint, CGSize

Essas etapas podem economizar o tempo todo, pois o Xcode no momento não nos dá uma conversão rápida do Swift 2+ para o Swift 3


Solução brilhante!
Oprimus

@Oprimus espero que reduz o aborrecimento :)
Rafat touqir Rafsun

26

No Swift 3, você pode simplesmente usar CGPoint.zeroou CGRect.zerono lugar de CGRectZeroou CGPointZero.

No entanto, no Swift 4, CGRect.zeroe 'CGPoint.zero'funcionará


1
@ChewieTheChorkie, você está certo, a "única" palavra criou confusão que eu removi.
guru

12

Se você quiser usá-los como no swift 2, poderá usar estas funções:

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

Basta colocá-los fora de qualquer classe e deve funcionar. (Funciona para mim, pelo menos)


9

As estruturas, bem como todos os outros símbolos no Core Graphics e outras APIs, ficaram mais limpas e também incluem nomes 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)

Exemplo do CGPoint:

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

Exemplo de CGVector:

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

Exemplo de CGSize:

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

Exemplo de CGRect:

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

Blog da Apple

As mudanças de renomeação de sintaxe e API do Swift no Swift 3 tornam a linguagem mais natural e proporcionam uma experiência ainda mais rápida ao chamar as estruturas do Cocoa. Estruturas populares Core Graphics e Grand Central Dispatch têm interfaces novas e muito mais limpas no Swift.


5

Tente o seguinte:

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

Esta é a versão mais recente do swift


como ele (Y), este seria mais fácil para a conclusão auto
Husam

5

Bônus Swift 3: Por que ninguém mencionou o formulário curto?

CGRect(origin: .zero, size: size)

.zero ao invés de CGPoint.zero

Quando o tipo é definido, você pode omiti-lo com segurança.


2

Você pode usar isso com a substituição do CGRectZero

CGRect.zero

0

No Swift 4 , funciona como abaixo

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

0

Para CGSize

CGSize(width: self.view.frame.width * 3, height: self.view.frame.size.height)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.