Swift 可滚动视图dilema上的Cocoa绘图
我在Swift上开发了我的第一个OSX应用程序,我对一些可可豆的概念感到迷茫 我在NSScrollView中放置了一个自定义NSView。我在重写的drawRect函数中绘制了复杂的图表。图表相当大,但NSScrollView的工作是滚动整个视图 我不高兴的是,每次调用drawRect时,我都会重新绘制整个图表,而且在滚动、调整大小等过程中,调用得非常频繁 绘制图表需要大量的计算,并且需要绘制大量的形状。每次调用drawRect时都这样做似乎是错误的。我知道我可以将绘图限制为可见/脏矩形,但这将更加复杂,需要更多的计算 有没有更好的方法来绘制这样一个可滚动的图表?最好只绘制一次整个图表,而不用担心以后重新绘制 我想在将来为我的图表添加一些交互性(鼠标点击)。这可能是重要的信息Swift 可滚动视图dilema上的Cocoa绘图,swift,macos,cocoa,nsview,nsscrollview,Swift,Macos,Cocoa,Nsview,Nsscrollview,我在Swift上开发了我的第一个OSX应用程序,我对一些可可豆的概念感到迷茫 我在NSScrollView中放置了一个自定义NSView。我在重写的drawRect函数中绘制了复杂的图表。图表相当大,但NSScrollView的工作是滚动整个视图 我不高兴的是,每次调用drawRect时,我都会重新绘制整个图表,而且在滚动、调整大小等过程中,调用得非常频繁 绘制图表需要大量的计算,并且需要绘制大量的形状。每次调用drawRect时都这样做似乎是错误的。我知道我可以将绘图限制为可见/脏矩形,但这将
谢谢如果您的自定义视图在绘图过程中不需要处于“活动”状态,这意味着滚动不会更改视图的内容,那么您可以通过多种方式执行此操作 我通过知道视图何时滚动来解决这类问题。您可能希望看到的一件事是注册自定义视图以从滚动视图中获取通知。特别是
nsScrollViewwillstartiveScrollNotification
。当视图滚动时,您可以将自定义视图缓存到NSBitmapImageRep
中,并绘制该视图。我以前用一个非常复杂的视图做过这件事,效果非常好
另一个可能更简单的问题是NSScrollView的ScrollsDynamicly
属性
在Swift 2中,您可以使用以下帮助
在您的awakeFromNib
NSNotificationCenter.defaultCenter().addObserver(self, selector: "startScrolling", name: NSScrollViewWillStartLiveScrollNotification, object: self.scrollView)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "endScrolling", name: NSScrollViewDidEndLiveScrollNotification, object: self.scrollView)
然后
你的画法
override func drawRect(dirtyRect: NSRect) {
if self.scrolling {
self.viewRep.drawInRect(....) // you can draw the viewRep here
}
else {
//your normal drawing code here
}
}
如果您的自定义视图在绘图期间不需要处于“活动”状态,这意味着滚动不会更改视图的内容,那么您可以通过多种方式执行此操作 我通过知道视图何时滚动来解决这类问题。您可能希望看到的一件事是注册自定义视图以从滚动视图中获取通知。特别是
nsScrollViewwillstartiveScrollNotification
。当视图滚动时,您可以将自定义视图缓存到NSBitmapImageRep
中,并绘制该视图。我以前用一个非常复杂的视图做过这件事,效果非常好
另一个可能更简单的问题是NSScrollView的ScrollsDynamicly
属性
在Swift 2中,您可以使用以下帮助
在您的awakeFromNib
NSNotificationCenter.defaultCenter().addObserver(self, selector: "startScrolling", name: NSScrollViewWillStartLiveScrollNotification, object: self.scrollView)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "endScrolling", name: NSScrollViewDidEndLiveScrollNotification, object: self.scrollView)
然后
你的画法
override func drawRect(dirtyRect: NSRect) {
if self.scrolling {
self.viewRep.drawInRect(....) // you can draw the viewRep here
}
else {
//your normal drawing code here
}
}
@Marek drawRect方法中的if-else语句是否正常工作?@Andy Federoff在我看来,它一直都是这样。我不明白为什么不会。@MAH你能看看我的帖子吗?我对drawRect有问题@AndyFedoroff我不确定它为什么不起作用,但原因肯定不是if-else语句不起作用。@Marek drawRect方法中的if-else语句是否正常工作?@Andy Federoff供我使用,它总是这样。我不明白为什么不会。@MAH你能看看我的帖子吗?我对drawRect有问题@AndyFedoroff我不知道为什么它不起作用,但原因肯定不是if-else语句不起作用。