CGRectMake, CGPointMake, CGSizeMake, CGRectZero, CGPointZero недоступний у Swift


242

Після перетворення коду на останній швидкий 3.0 мені з’являється ця помилка.

введіть тут опис зображеннявведіть тут опис зображення

Також скажіть мені рішення для CGSize = CGSizeMake(0,0)

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

Що також недоступно.


Але після перетворення мого попереднього коду в swift3 я отримав цю проблему, хотів би знати, чи є зміни в синтаксисі в оновленій версії
niravdesai21

Відповіді:


493

CGRectМожна просто створити за допомогою екземпляра CGPointабо CGSize, що наведено нижче.

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

Або якщо ми хочемо вказати кожне значення у CGFloatабо, Doubleабо Intми можемо використовувати цей метод.

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

CGPoint Можна створити так.

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

CGSize Можна створити так.

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

Також розмір і крапка з 0 як значення, це можна зробити так.

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& CGPointZeroзамінено на CGRect.zero& CGPoint.zeroв Swift 3.0.


Чи можете ви також сказати мені рішення для CGSize = CGSizeMake (0,0), яке не прокидається в швидкому 3
niravdesai21

@ niravdesai21 Оновлено питання, будь ласка, перевірте.

У CGPointZero та CGRectZero також немає доступного рішення для цього? Оновлене запитання, будь ласка, оновіть відповідь
niravdesai21

@ niravdesai21 Оновлено.

4
"CGRectZero недоступний у Swift", коли насправді це зміна синтаксису на CGRect.zero - жарт! Цим хлопцям потрібно працювати над їхніми попередженнями щодо компіляції ... Вони покладаються на Stack Overflow, щоб постійно їх
виправляти

49

Швидке виправлення для CGRectMake, CGPointMake, CGSizeMake у Swift3 та iOS10

Додайте ці розширення:

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

Потім перейдіть до " Знайти та замінити в робочій області ". Знайдіть CGRectMake, CGPointMake, CGSizeMake та замініть їх на CGRect, CGPoint, CGSize

Ці кроки можуть економити весь час, оскільки Xcode зараз не дає нам швидкого переходу з Swift 2+ у Swift 3


Блискуче рішення!
Оприм

@Oprimus сподіваюся, що це зменшить ваші клопоти :)
Rafat touqir Rafsun

26

У Swift 3 ви можете просто використовувати CGPoint.zeroабо CGRect.zeroзамість CGRectZeroабо CGPointZero.

Однак у Swift 4 CGRect.zeroі 'CGPoint.zero'буде працювати


1
@ChewieTheChorkie Ви праві, "єдине" слово створило плутанину, я це усунув.
гуру

12

Якщо ви хочете використовувати їх як у швидкому 2, ви можете використовувати ці функції:

Для CGRectMake:

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

Для CGPointMake:

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

Для CGSizeMake:

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

Просто поставте їх за межі будь-якого класу, і це повинно працювати. (Для мене працює принаймні)


9

Структури, а також усі інші символи в Core Graphics та інших API стали чистішими, а також містять назви параметрів. 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)

Приклад CGPoint:

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

Приклад CGVector:

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

Приклад CGSize:

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

Приклад CGRect:

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

Apple Blog

Зміни синтаксису та перейменування API Swift у Swift 3 роблять мову відчуттям більш природним та надають ще більший досвід Swift-y під час виклику фреймворків Cocoa. Популярні рамки Core Graphics та Grand Central Dispatch мають нові, набагато чистіші інтерфейси у Swift.


5

Спробуйте наступне:

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

Це для Свіфта останньої версії


як це (Y), це буде простіше для автоматичного завершення
Хусам

5

Swift 3 Bonus: Чому ніхто не згадав коротку форму?

CGRect(origin: .zero, size: size)

.zero замість CGPoint.zero

Коли тип визначений, його можна сміливо опустити.


2

Ви можете використовувати це із заміною CGRectZero

CGRect.zero

0

У Swift 4 він працює як нижче

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.