import UIKit
import Metal
import QuartzCore
class ViewController: UIViewController {
var device: MTLDevice! = nil
var metalLayer: CAMetalLayer! = nil
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
device = MTLCreateSystemDefaultDevice()
metalLayer = CAMetalLayer() // 1
metalLayer.device = device // 2
metalLayer.pixelFormat = .BGRA8Unorm // 3
metalLayer.framebufferOnly = true // 4
metalLayer.frame = view.layer.frame // 5
view.layer.addSublayer(metalLayer) // 6
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
当我在ViewController.swift中有这个时,我收到错误"使用未声明类型CAMetalLayer
"即使我已经进口了Metal和QuartzCore。如何才能使此代码生效?
答案 0 :(得分:53)
金属代码无法在模拟器上编译。尝试编译设备。
答案 1 :(得分:1)
如果您的应用具有不依赖于Metal的后备或模式,并且您想为模拟器编译应用,则可以执行以下操作:
#if targetEnvironment(simulator)
// dummy, do-nothing view controller for simulator
class ViewController: UIViewController {
}
#else
class ViewController: UIViewController {
var device: MTLDevice! = nil
var metalLayer: CAMetalLayer! = nil
override func viewDidLoad() {
super.viewDidLoad()
device = MTLCreateSystemDefaultDevice()
metalLayer = CAMetalLayer()
...
}
}
#endif
然后,您的代码至少将针对设备和模拟器进行编译,这可以简化您的非金属开发。
答案 2 :(得分:0)
如果您将XCode项目命名为“ Metal”,则可能会出现相同的问题。
在这种情况下,编译器会感到困惑,并且您会收到相同的错误消息。