CGRectMake, CGPointMake, CGSizeMake, CGRectZero, CGPointZero недоступен в Swift
После преобразования кода в последний swift 3.0 я покажу эту ошибку.
![введите описание изображения здесь]()
Также скажите мне решение для CGSize = CGSizeMake(0,0)
static var frameAtStartOfPan: CGRect = CGRectZero
static var startPointOfPan: CGPoint = CGPointZero
который также недоступен.
Ответы
Ответ 1
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
.
Ответ 2
Быстрое исправление для 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
Ответ 3
В Swift 3 вы можете просто использовать CGPoint.zero
или CGRect.zero
вместо CGRectZero
или CGPointZero
.
Тем не менее, в Swift 4, CGRect.zero
и 'CGPoint.zero'
будут работать
Ответ 4
Структуры, а также все другие символы в 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
Синтаксис Swift и изменения переименования API в Swift 3 делают язык более естественным и обеспечивают более быструю работу при вызове фреймворков Cocoa. В популярных средах Core Graphics и Grand Central Dispatch есть новые, более чистые интерфейсы в Swift.
Ответ 5
Если вы хотите использовать их как в swift 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)
}
Просто поставьте их вне любого класса, и он должен работать. (Работает для меня как минимум)
Ответ 6
Попробуйте следующее:
var myToolBar = UIToolbar.init(frame: CGRect.init(x: 0, y: 0, width: 320, height: 44))
Это для последней версии swift
Ответ 7
Swift 3 Бонус: Почему никто не упомянул короткую форму?
CGRect(origin: .zero, size: size)
.zero
вместо CGPoint.zero
Когда тип определен, вы можете спокойно опустить его.
Ответ 8
Вы можете использовать это с заменой CGRectZero
CGRect.zero
Ответ 9
В Swift 4 это работает как ниже
collectionView.setContentOffset(CGPoint.zero, animated: true)
Ответ 10
Для CGSize
CGSize(width: self.view.frame.width * 3, height: self.view.frame.size.height)