我正在寻找一种方法来渲染CALayer或NSView并重新获得NSImage.
我有一个自定义类,它是NSView的子类.在开始时,我只需制作一个渐变图层来覆盖所有NSView.
class ContentView: NSView {
override func draw(_ dirtyRect: NSRect) {
fillGradientLayer()
}
func fillGradientLayer() {
gradientLayer = CAGradientLayer()
gradientLayer.colors = [#colorLiteral(red: 0, green: 0.9909763549, blue: 0.7570167824, alpha: 1),#colorLiteral(red: 0, green: 0.4772562545, blue: 1, alpha: 1)].map({return $0.cgColor})
gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1, y: 0.5)
gradientLayer.frame = self.frame.insetBy(dx: margin, dy: margin)
gradientLayer.zPosition = 2
gradientLayer.name = "gradientLayer"
gradientLayer.contentsScale = (NSScreen.main()?.backingScaleFactor)!
self.layer?.addSublayer(gradientLayer)
}
}
Run Code Online (Sandbox Code Playgroud)
在某些时候,我想从CALayer获得NSImage(或CGImage).在一些主题中,我找到了下一个方法并将其转化为:
extension CALayer {
func getBitmapImage() -> NSImage {
let …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何使用xib文件创建自定义视图.在这个问题中,使用了下一个方法.
NSBundle.mainBundle().loadNibNamed("CardView", owner: nil, options: nil)[0] as! UIView
Run Code Online (Sandbox Code Playgroud)
Cocoa有相同的方法,但是,这个方法已经在swift 3中更改为loadNibNamed(_:owner:topLevelObjects :),它返回 Bool,而之前的代码生成"Type Bool没有下标成员"错误,这很明显,因为返回类型是Bool.
所以,我的问题是如何从Swift 3中的xib文件加载视图
我开始学习 C++,现在我想知道我是否也可以在 Swift 中做一些事情。
我从来没有真正想过当我们将变量作为参数传递给 Swift 中的函数时会发生什么。
让我们使用类型变量string作为示例。
在 C++ 中,我可以通过制作函数的副本或传递引用/指针来将参数传递给函数。
void foo(string s)或者void foo (string& s); 在第一种情况下,将创建原始变量的副本,并且foo将收到一个副本。在第二种情况下,我基本上传递内存中变量的地址而不创建副本。
现在在 Swift 中我知道我可以将函数的参数声明为inout,这意味着我可以修改原始对象。
1) func foo(s:String)... 2) func testPassingByReference(s: inout String)...
我对 String 进行了扩展以打印对象的地址:
extension String {
func address() -> String {
return String(format: "%p", self);
}
}
Run Code Online (Sandbox Code Playgroud)
结果并不是我所期望看到的。
var str = "Hello world"
print(str.address())
Run Code Online (Sandbox Code Playgroud)
0x7fd6c9e04ef0
func testPassingByValue(s: String) {
print("he address of s is: \(s.address())")
}
func testPassingByReference(s: inout String) …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的协议:
protocol MyProtocol {
associatedtype SpeedType
var name: String {get set}
func forward(_: SpeedType)
}
Run Code Online (Sandbox Code Playgroud)
我做了两个符合这个协议的简单类:
class A: MyProtocol {
typealias SpeedType = Double
var name: String
init(name:String) {
self.name = name
}
func forward(_ s: Double) {
print("Moving \(s) km/h")
}
}
class B: MyProtocol {
typealias SpeedType = Int
var name: String
init(name:String) {
self.name = name
}
func forward(_ s: Int) {
print("Moving \(s) km/h")
}
}
Run Code Online (Sandbox Code Playgroud)
我想要实现的是能够声明一个MyProtocol类型的变量,并在以后初始化它:
let x: Bool = true
var person: …Run Code Online (Sandbox Code Playgroud)