在Swift编码并得到上述错误......
消息掩盖其他东西还是你真的不能添加两个CGFloat操作数?如果没有,为什么(在地球上)不?
我正在尝试的代码没有什么特别之处; 有趣的是,上面的错误消息VERBATIM是Swift助手编译器告诉我的内容(用红色波浪线强调我的代码).
运行Xcode 6.3(Swift 1.2)
我有一个自定义的图层支持NSView,并覆盖makeBackingLayer方法返回自定义CALayer子类.我还覆盖了wantUpdateLayer以返回true,从而完全选择了类似图层的绘图.
override func makeBackingLayer() -> CALayer {
return Layer() // my custom class with "drawLayer:" implemented
}
override var wantsUpdateLayer:Bool{
return true
}
// never called
override func updateLayer() {
super.updateLayer()
println("updateLayer after")
self.layer?.borderWidth += 1
}
Run Code Online (Sandbox Code Playgroud)
一旦我这样做,我发现当我设置NSView.needsDisplay = true它时,路由调用自定义层的drawInContext:方法而不是updateLayer:方法.为什么这样做?在我的例子中,我检查了如果我删除了makeBackingLayer覆盖,那么我updateLayer的预期方式被调用.
我无法完全理解它,但其他实例指出的是,当你的makeBackingLayer returns a customCALayer`实际上你的自定义层托管在父背衬层内时.(我的纯粹猜测)
此外,鉴于CALayer的drawInContext:更"低级",两条绘图路线之间是否会有不同的性能特征?有关该问题的更多详细信息,请参阅此SO问题:直接在CALayer.drawInContext中呈现的图层支持的NSView性能:
任何见解将不胜感激.
有一个与.NET对象相关的固定开销,在这个SO问题中有更全面的概述:.NET对象的内存开销是12或24字节,具体取决于你是在32位还是64位进程.
也就是说,类似的基本值类型int, double, boolean不会产生任何开销,因为它们是值类型.
struct在您的应用程序中放置自定义类型的位置在哪里?一方面,它们是int, double, boolean如上所述的价值类型[因此不应产生开销],但另一方面,它们间接地从中得到System.Object,因此(技术上)应该产生开销.
我已设法IBDesignable/IBInspectable使用直接子类NSView但不使用直接子类的属性NSButton.这让我质疑,实际上Cocoa的实现是否仅限于此NSView.
几乎Web上的每个示例(以及Apple WWDC 2014 Xcode视频)都使用NSView然后将自定义视图组件从库中拖到画布上(然后更改其类).
是否有可能使用IBDesignable与子类NSControl和NSButton等...?我在网上看过很多使用的例子UIButton.
如果有可能,那么你应该从库中拖到画布上的是什么?将它作为"自定义视图"是没有意义的.另一方面,没有"自定义控件"可用.
为了清楚起见,我可以在设计时显示IBInspectable属性; 但任何更改似乎都不会在设计时生成渲染.
解决方法是NSButton在一个NSView(通过组合)中包装我想要创建的任何自定义,但这看起来有点像黑客......
我有几个视图,我需要与我正在制作的自定义NSScrollView子类进行协作.一种类型的视图需要相对于NSScrollView中的滚动完全修复,另一种类型需要将其外壳固定在相对于滚动的位置,但允许内部内容在滚动视图更改时滚动(如电子表格中的列标题)例如).
以下是在视图层次结构AFAIK中放置这些视图的选项:
*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: A multiplier of 0 or a nil second item together with a location for the first attribute creates an illegal constraint of a location equal to a constant. Location attributes must be specified in pairs)===
我还在线阅读了多个地方,我将无法使用该Visual Format Language方法来设置我的约束,因为浮动约束不是相对于直接超视图设置的.这是我上面做错了的线索,因为第二种方法可以使用VCL,而第一种方法需要手动创建NSLayoutConstraint.
===
以下是我添加到NSScrollView子类的初始化程序中的Swift代码:
topCorner = NSButton()
topCorner.translatesAutoresizingMaskIntoConstraints = false
topCorner.bezelStyle = NSBezelStyle.CircularBezelStyle //.RecessedBezelStyle
topCorner.setButtonType(NSButtonType.PushOnPushOffButton)
topCorner.identifier = "topCorner"
topCorner.title = "TC"
self.addSubview(topCorner)
thc = NSLayoutConstraint(item: self.topCorner, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: self.superview, …Run Code Online (Sandbox Code Playgroud) 我正在编写一个64位的F#解决方案,并且分析显示出一个惊人的,意外的大量时间花在JIT_TailCall...它实际上主宰了运行时(大约80%).这与其邪恶的堂兄一起出现JIT_TailCallHelperStub_ReturnAddress.
我肯定跟踪源代码struct在方法或属性调用中跨越程序集边界传递类型(自定义值类型).我确信这是因为如果我绕过方法调用并struct直接将我的属性分配给属性(违规方法正在使用的那个),性能会神奇地提高4-5倍,运行时间减少!
调用程序集正在使用F#3.1,因为它是使用FSharp.Compiler.Services的最新稳定版本动态编译的.
被调用的程序集使用的是F#4.0/.NET 4.6(VS 2015).
我想要做的简化是struct从动态生成的程序集中为数组中的位置分配自定义值...
运行时很快,调用时不会产生无关的尾调用:
但是,由于在调用时生成了无关的尾调用,运行时很慢:
暴露数组的索引器属性(Item)
作为数组的setter的成员方法
我需要调用成员方法的原因是我需要在将项插入数组之前执行一些检查.
除了理解问题的根源之外,我想知道F#4.0是否暗示即将发布的FSharp.Compiler.Services将解决这个问题.鉴于更新的FSharp.Compiler.Services相对迫在眉睫,因此最好等待.
在苹果文档之后,我试图NSTextView通过它的两个构造函数方法设置一个简单的.
我将以下代码放在viewDidAppear内容视图的视图控制器的方法中.NSTextViewtextView 是一个实例,frameRect是内容视图的框架.
以下Swift代码可以工作(给我一个可编辑的textView,屏幕上显示文字):
textView = NSTextView(frame: frameRect!)
self.view.addSubview(textView)
textView.textStorage?.appendAttributedString(NSAttributedString(string: "Hello"))
Run Code Online (Sandbox Code Playgroud)
以下不起作用(文本视图不可编辑,屏幕上不显示任何文本):
var textStorage = NSTextStorage()
var layoutManager = NSLayoutManager()
textStorage.addLayoutManager(layoutManager)
var textContainer = NSTextContainer(containerSize: frameRect!.size)
layoutManager.addTextContainer(textContainer)
textView = NSTextView(frame: frameRect!, textContainer: textContainer)
textView.editable = true
textView.selectable = true
self.view.addSubview(textView)
textView.textStorage?.appendAttributedString(NSAttributedString(string: "Hello more complex"))
Run Code Online (Sandbox Code Playgroud)
我在第二个例子中做错了什么?我试图遵循Apple的"可可文本架构指南"中给出的示例,他们NSTextView通过显式实例化其辅助对象Web来讨论设置.
我知道 Apple 不赞成使用 ,NSCell而赞成使用NSView(请参阅 AppKit 10.10 发行说明)。以前建议NSCell在需要许多控件时出于性能原因使用。
我花了相当多的时间来实现一个需要很多子视图的自定义控件,而使用 NSView 类型的子视图的性能并不好。请参阅相关的 stackoverflow 讨论 ,在窗口中可以拥有的 NSView 类型实例数量方面有哪些实际限制?我正在努力处理 1000-2000 个内存中的对象(这看起来并不多)。这种限制的实际原因是什么?
上面让我感到困惑的一件事是基于视图的 Cocoa NSTableViews。您可以创建超过 1000-2000 个单元格的 tableViews,并且它们的加载和滚动性能似乎并不差?如果每个单元格都是一个 NSView,那么这是如何实现的?
如果有实际限制,那么当 Apple 说他们不赞成使用 NSCell 时,他们在想什么?我相信他们知道某些控件需要大量的子视图。
此外,(可能已经过时的)Apple Developer Guide 对 NSView 和 NSCell 之间的区别给出了以下解释,我需要进一步解释:
“因为单元格比控件更轻,在继承的数据和行为方面,使用多单元格控件比使用多个控件更有效。”
继承的数据:如果数据被使用 => 这肯定只会导致“膨胀”,并且只会在你需要的时候使用它?
继承行为:您不在类/对象中使用的方法肯定不会造成任何开销?
轻量级 NSCell 与重量级 NSView 之间的真正区别是什么,除了它似乎被传统接受之外? (我真的很想知道。)
我有很多层支持的视图包含在a中NSScrollview,主要关注滚动性能.的documentView和更高的是层支持因此它们的子视图也层支持的.
以下是显示/呈现代码可能出现的三个自然位置:
NSView.wantsUpdateLayer返回false(或者不执行任何操作,因为这是默认值)并在NSView的drawRect方法中进行绘制NSView.wantsUpdateLayer返回true并在NSView的updateLayer方法中绘图NSView并用CALayer的drawInContext方法执行所有绘图从WWDC 2013会话215的讨论中可以看出,(2)比(1)更具性能,因为视图不需要为drawRect输出创建临时存储.首先,我没有100%清晰地知道什么时候"支持商店",什么时候没有呢?其次,(2)和(3)如何比较以及何时可以使用一个而不是另一个?
特别是,我必须在我的视图中绘制文字.我将如何在updateLayer调用中执行此操作?绘制文本的唯一例子似乎需要掌握一个上下文 - 这在当然不可用updateLayer.
enum Tree{
case Leaf(String)
case Node(Tree)
} //compiler not happy!!
enum Tree{
case Leaf(String)
case Node([Tree])
} //compiler is happy in (arguably) a more complex recursive scenario?
Run Code Online (Sandbox Code Playgroud)
Swift编译器如何为第二个(更复杂的)场景工作而不是第一个?
cocoa ×7
swift ×6
.net ×2
calayer ×2
nsscrollview ×2
nsview ×2
objective-c ×2
appkit ×1
autolayout ×1
c# ×1
cgfloat ×1
f# ×1
ibdesignable ×1
nscell ×1
nstextview ×1
struct ×1
xcode ×1