PDA

View Full Version : Scrollbars and big picture




chumchum
Nov 11, 2010, 04:27 PM
Hi everyone,

I am writing an application that displays a large graph. When I use an NSScrollView the application slows down as the graph is quite big and therefore slow to draw on a subclass of NSView. Instead I would like to draw only the part of the graph that is visible (the size of the window) but I would still need scrollbars to choose what part of the graph is supposed to be drawn. Does any body as any suggestions about how to implement this as I am new to cocoa. Should I subclass an NSScrollView, or use NSSlider (although they are not very nice)?

Thanks
M



robbieduncan
Nov 11, 2010, 04:28 PM
Use an NSScrollView and only draw the correct portion of the content view as it's requested.

chumchum
Nov 11, 2010, 09:52 PM
Hi

Thanks for the reply but do you have any suggestions on how to extend NSScrollView?

Cheers,
M

chown33
Nov 11, 2010, 11:47 PM
There is no reason to subclass NSScrollView. Doing so won't solve anything.

If the problem is your BigGraphView, then nothing done by NSScrollView can make BigGraphView draw less. The problem lies in BigGraphView. You wrote:
Instead I would like to draw only the part of the graph that is visible ...

Well why are you drawing parts that aren't visible? And why would you think that NSScrollView could make your class draw less?

If you're drawing parts that lie outside the visible part of your view, then stop drawing those parts. You should only draw the parts that lie inside the bounds rect of your document view, which will be set by the content view of the NSScrollView.

If your view is drawing invisible parts, then nothing NSScrollView can do will cause your view to draw less. You have to change how your view draws. When you do that, then NSScrollView will be faster.

If that doesn't make sense, then you don't understand how NSScrollView works. Review the reference doc:
http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/NSScrollViewGuide/Articles/Basics.html%23//apple_ref/doc/uid/TP40003461-SW1

From that reference doc:
The content view is responsible for managing the position of the document view, clipping the document view to the content view's frame, and handling the details of scrolling in an efficient manner. The content view scrolls the document view by altering its bounds rectangle, which determines where the document view’s frame lies.

gnasher729
Nov 12, 2010, 02:26 PM
There is no reason to subclass NSScrollView. Doing so won't solve anything.

If the problem is your BigGraphView, then nothing done by NSScrollView can make BigGraphView draw less. The problem lies in BigGraphView. You wrote:

Well why are you drawing parts that aren't visible? And why would you think that NSScrollView could make your class draw less?

If you're drawing parts that lie outside the visible part of your view, then stop drawing those parts. You should only draw the parts that lie inside the bounds rect of your document view, which will be set by the content view of the NSScrollView.

If your view is drawing invisible parts, then nothing NSScrollView can do will cause your view to draw less. You have to change how your view draws. When you do that, then NSScrollView will be faster.

If that doesn't make sense, then you don't understand how NSScrollView works. Review the reference doc:
http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/NSScrollViewGuide/Articles/Basics.html%23//apple_ref/doc/uid/TP40003461-SW1

From that reference doc:
The content view is responsible for managing the position of the document view, clipping the document view to the content view's frame, and handling the details of scrolling in an efficient manner. The content view scrolls the document view by altering its bounds rectangle, which determines where the document view’s frame lies.


You'd hope that drawRect: had some parameter telling the view which bits need to be redrawn. Wait a second...