- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 NSView 的 getRectsBeingDrawn
,但我不太确定如何转换它需要的变量。
它的定义是:
func getRectsBeingDrawn(rects: UnsafeMutablePointer<UnsafePointer<NSRect>>, count: UnsafeMutablePointer<Int>)
我已经将 rects
和 count
定义为:
var rects: UnsafeMutablePointer<UnsafePointer<NSRect>> = nil
var count: UnsafeMutablePointer<Int> = nil
这似乎有效。调试器没有提供任何方便的东西来查看指针中的内容,所以这没有帮助。
在调用getRectsBeingDrawn
之后,
rect
应该指向一个NSRect 数组,但它似乎没有返回任何内容。另外,如何获取 rects 和 count 指向的数组和 int?
我正在尝试从 Apple 示例“TableViewPlayground”中获取一段代码以快速工作。
- (void)drawSelectionInRect:(NSRect)dirtyRect {
NSColor *primaryColor = [[NSColor alternateSelectedControlColor] colorWithAlphaComponent:0.5];
NSColor *secondarySelectedControlColor = [[NSColor secondarySelectedControlColor] colorWithAlphaComponent:0.5];
// Implement our own custom alpha drawing
switch (self.selectionHighlightStyle) {
case NSTableViewSelectionHighlightStyleRegular: {
if (self.selected) {
if (self.emphasized) {
[primaryColor set];
} else {
[secondarySelectedControlColor set];
}
NSRect bounds = self.bounds;
const NSRect *rects = NULL;
NSInteger count = 0;
[self getRectsBeingDrawn:&rects count:&count];
for (NSInteger i = 0; i < count; i++) {
NSRect rect = NSIntersectionRect(bounds, rects[i]);
NSRectFillUsingOperation(rect, NSCompositeSourceOver);
}
}
break;
}
default: {
// Do super's drawing
[super drawSelectionInRect:dirtyRect];
break;
}
}
}
最佳答案
我已经设法弄清楚了...我没有为 rects
和 count
正确分配内存
我得到的是:
var rects: UnsafeMutablePointer<UnsafePointer<NSRect>> = nil
var count: UnsafeMutablePointer<Int> = nil
最终解决问题的是:
var rects: UnsafeMutablePointer<UnsafePointer<NSRect>> = UnsafeMutablePointer<UnsafePointer<NSRect>>.alloc(1)
var count: UnsafeMutablePointer<Int> = UnsafeMutablePointer<Int>.alloc(1)
希望这对其他人有帮助:)
edit 如果有人感兴趣,下面是上面的 swift 代码:
override func drawSelectionInRect(dirtyRect: NSRect) {
var primaryColor = NSColor.alternateSelectedControlColor().colorWithAlphaComponent(0.5)
var secondarySelectedControlColor = NSColor.secondarySelectedControlColor().colorWithAlphaComponent(0.5)
switch (self.selectionHighlightStyle){
case .Regular:
if (self.selected){
if self.emphasized{
primaryColor.set()
}else{
secondarySelectedControlColor.set()
}
let bounds = self.bounds
var rects: UnsafeMutablePointer<UnsafePointer<NSRect>> = UnsafeMutablePointer<UnsafePointer<NSRect>>.alloc(1)
var count: UnsafeMutablePointer<Int> = UnsafeMutablePointer<Int>.alloc(1)
self.getRectsBeingDrawn(rects, count: count)
let rectArrayPtr = UnsafeMutableBufferPointer(start: rects, count: count.memory)
var base = rectArrayPtr.baseAddress
for var i = 0; i < count.memory; i++ {
var currentRect = base.memory
let rect = NSIntersectionRect(bounds, currentRect.memory)
NSRectFillUsingOperation(rect, .CompositeSourceOver)
base.successor()
}
}
default:
super.drawSelectionInRect(dirtyRect)
}
}
编辑
根据进一步的评论,这里用一种不太冗长的方法实现了同样的效果(感谢下面的 Paul Patterson):
http://stackoverflow.com/questions/32536855/using-getrectsbeingdrawn-with-swift
关于Swift UnsafeMutablePointer & UnsafeMutablePointer<UnsafePointer<SomeType>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31311166/
给定 public struct MIDIPacketList { public var numPackets: UInt32 public var packet: (MIDIPack
我第一次尝试快速使用 CommonCrypto(在 https://github.com/sergejp/CommonCrypto 的帮助下)。这是我的代码: UnsafeRawPointer(ivD
我正在为 OS X 使用 Swift 中的外部 C 库。我得到一个值 cda,它在 C 中定义为 double* (它是一个指向 double 组的指针)。 当导入到 Swift 中时,它会将类型识别
我正在尝试更新我在 http://mattg411.com/swift-coremidi-callbacks/ 找到的 CoreMidi 示例中的代码 代码是 Swift 3 之前的代码,所以我需要做
我正在编写一个需要与 C 库进行互操作的 Swift 程序。此 C 库包含一组使用回调的函数。我解决了如何将 Swift 函数传递给这些 C 函数的问题,但我很难将 Swift 原生类型转换为适当的
当我定义行时出现构建错误 let runFont : CTFontRef = CFDictionaryGetValue(CTRunGetAttributes(run), kCTFontAttribu
我正在尝试访问 AVAudioPCMBuffer.floatChannelData使用 Swift 但它的类型是 UnsafePointer> (在 Objective-C 中,@property(n
在 Swift 中,我想传递 data 类型的数据缓冲区(名为 Data )到一个 C 函数(名为 do_something ),它采用 UnsafePointer 类型的指针. 下面的代码示例是否正
我正在与运行 C++ 代码并向 iOS 设备发送几乎每秒 10 次实时数据的硬件设备进行交互。 我有一个像这样的 Swift 方法: func m16b_to_mE0(_ pointer: Unsaf
以下单元测试总是失败,因为一些 UnsafePointer 等于其他一些。我观察到至少 3 个字符串的这种行为。我在 High Sierra 版本 10.13.1 (17B48) 上使用 Xcode
我正在尝试转换 UnsafePointer到UnsafePointer到目前为止,我以这个解决方案结束: let bufferSize = 1024 let buffer: UnsafePointer
我希望能够从不可变值创建一个 UnsafePointer。 我尝试做的最简单的复制如下: let number : Int = 42; var pointer = UnsafePointer(&num
我发现以下代码可以编译并运行: func foo(p:UnsafePointer) { var p = p for p; p.memory != 0; p++ { pr
尝试清除我的 SWIFT 5/XCODE 项目中的一些警告,但我陷入了困境: let sendBytes:[UInt8] = [0x0, 0x0, 0x5, 0x0] let msgData =
所以以前我打开了Initialization of 'UnsafePointer' results in a dangling pointer,但是mods说它是重复的。 但是我不认为这是重复的,因为
我对 Swift 很陌生。尝试编写一个调用外部 C 方法的 Swift 应用程序。但是,Xcode 编译器给出了有关类型转换的错误。 C 方法原型(prototype)的形式为: void * cMe
据我了解,UnsafePointer 将指针对象呈现为不可变的,而 UnsafeMutablePointer 将指针对象呈现为可变的。但是 vDSP 函数的签名 vDSP_zrvmul如下: func
我试过这个方法: String.stringWithCString(cString: UnsafePointer, encoding: NSStringEncoding) 但不幸的是,它只适用于 Un
我有一个二进制文件,其中包含许多 Float 值的三元组;它实际上是一长串 SCNVector3,表示 SCNGeometrySource 的顶点。我将文件(请原谅遗漏了 do-try-catch 等
如何调用以下函数: func AXUIElementCopyAttributeNames(element: AXUIElement!, names: UnsafePointer?>) -> AXErr
我是一名优秀的程序员,十分优秀!