CGRectMake, CGPointMake, CGSizeMake, CGRectZero, CGPointZero không có sẵn trong Swift


242

Sau khi chuyển đổi mã sang swift 3.0 mới nhất, tôi thấy lỗi này.

nhập mô tả hình ảnh ở đâynhập mô tả hình ảnh ở đây

Cũng cho tôi biết giải pháp cho CGSize = CGSizeMake(0,0)

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

Mà cũng không có.


Nhưng sau khi chuyển đổi mã trước đây của tôi sang swift3 tôi đã gặp sự cố này, muốn biết liệu có bất kỳ thay đổi nào về cú pháp trong phiên bản cập nhật hay không
niravdesai21

Câu trả lời:


493

CGRectCó thể được tạo một cách đơn giản bằng cách sử dụng một thể hiện của một CGPointhoặc CGSize, được đưa ra dưới đây.

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

Hoặc nếu chúng ta muốn xác định mỗi giá trị trong CGFloathay Doublehay Int, chúng ta có thể sử dụng phương pháp này.

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

CGPoint Có thể được tạo ra như thế này.

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

CGSize Có thể được tạo ra như thế này.

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

Ngoài ra kích thước và điểm với 0 là các giá trị, nó có thể được thực hiện như thế này.

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& CGPointZerothay thế bằng CGRect.zero& CGPoint.zerotrong Swift 3.0.


Bạn cũng có thể cho tôi biết giải pháp cho CGSize = CGSizeMake (0,0) không bị
giật

@ niravdesai21 Cập nhật câu hỏi, vui lòng kiểm tra.

CGPointZero và CGRectZero cũng không có giải pháp nào cho điều đó? Câu hỏi cập nhật xin vui lòng cập nhật câu trả lời
niravdesai21

@ niravdesai21 Cập nhật.

4
"CGRectZero không có sẵn trong Swift" khi thực sự đó là một cú pháp thay đổi thành CGRect.zero là một trò đùa! Những kẻ này cần phải làm việc với các cảnh báo biên dịch của họ thời gian lớn ... Họ dựa vào Stack Overflow để bảo lãnh họ liên tục
Magoo

49

Khắc phục nhanh cho CGRectMake, CGPointMake, CGSizeMake trong Swift3 & iOS10

Thêm các tiện ích mở rộng này:

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

Sau đó, đi đến " Tìm và thay thế trong không gian làm việc " Tìm CGRectMake, CGPointMake, CGSizeMake và thay thế chúng bằng CGRect, CGPoint, CGSize

Các bước này có thể tiết kiệm toàn bộ thời gian vì Xcode ngay bây giờ không cung cấp cho chúng tôi chuyển đổi nhanh từ Swift 2+ sang Swift 3


Giải pháp tuyệt vời!
Oprimus

@Oprimus hy vọng nó sẽ giảm bớt rắc rối của bạn :)
Rafat touqir Rafsun

26

Trong Swift 3, bạn chỉ cần sử dụng CGPoint.zerohoặc CGRect.zerothay thế CGRectZerohoặc CGPointZero.

Tuy nhiên, trong Swift 4, CGRect.zero'CGPoint.zero'sẽ hoạt động


1
@ChewieTheChorkie bạn nói đúng từ "chỉ" mà tôi đã nhầm lẫn.
guru

12

Nếu bạn muốn sử dụng chúng như trong swift 2, bạn có thể sử dụng các chức năng này:

Đối với CGRectMake:

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

Đối với CGPointMake:

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

Đối với CGSizeMake:

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

Chỉ cần đặt chúng bên ngoài bất kỳ lớp học và nó sẽ làm việc. (Làm việc cho tôi ít nhất)


9

Các cấu trúc cũng như tất cả các biểu tượng khác trong Core Graphics và các API khác đã trở nên sạch hơn và cũng bao gồm các tên tham số. 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)

Ví dụ CGPoint:

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

Ví dụ về CGVector:

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

Ví dụ CGSize:

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

Ví dụ CGRect:

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

Blog của Apple

Cú pháp Swift và đổi tên API trong Swift 3 làm cho ngôn ngữ cảm thấy tự nhiên hơn và cung cấp trải nghiệm Swift-y thậm chí nhiều hơn khi gọi các khung công tác Cacao. Các khung phổ biến Core Graphics và Grand Central Dispatch có giao diện mới, gọn gàng hơn nhiều trong Swift.


5

Hãy thử như sau:

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

Đây là phiên bản mới nhất của swift


Giống như nó (Y), điều này sẽ dễ dàng hơn để hoàn thành tự động
Husam

5

Phần thưởng Swift 3: Tại sao không ai nhắc đến hình thức ngắn?

CGRect(origin: .zero, size: size)

.zero thay vì CGPoint.zero

Khi loại được xác định, bạn có thể bỏ qua nó một cách an toàn.


2

Bạn có thể sử dụng điều này với sự thay thế của CGRectZero

CGRect.zero

0

Trong Swift 4, nó hoạt động như dưới đây

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.