小编Ale*_*xei的帖子

从CALayer或NSView获取图像(swift 3)

我正在寻找一种方法来渲染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)

cocoa nsview swift swift3

9
推荐指数
1
解决办法
2932
查看次数

Swift 3加载xib.NSBundle.mainBundle().loadNibNamed返回Bool

我试图弄清楚如何使用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文件加载视图

cocoa xib nsview nib swift3

7
推荐指数
2
解决办法
6675
查看次数

在 Swift 中通过引用传递变量

我开始学习 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)

memory-address swift swift3

5
推荐指数
1
解决办法
9216
查看次数

符合具有通用功能的协议的变量

我有一个看起来像这样的协议:

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)

generics protocols swift

2
推荐指数
1
解决办法
857
查看次数

标签 统计

swift ×3

swift3 ×3

cocoa ×2

nsview ×2

generics ×1

memory-address ×1

nib ×1

protocols ×1

xib ×1