-1

What is the correct formula for the location of an NSRulerMarker on a vertical NSRulerView, if the client view is flipped?

The situation: I have a view (let's call it the "main view") that is embedded in an NSScrollView with rulers, and it has subviews. The user can drag these subviews around, and while dragging, I want to indicate the current position on the rulers.

The main view is flipped: The zero point is top-left.

The horizontal position is pretty simple:

NSPoint scroll = myScrollView.documentVisibleRect.origin;
NSRect rect = mySubView.frame;
rulerMarkerDragLeft.markerLocation = rect.origin.x - scroll.x;

However the same method for the vertical position...

rulerMarkerDragTop.markerLocation = rect.origin.y - scroll.y;

does not work. The marker is only in the correct position when the scrollview has been scrolled down to the extreme bottom. For every n points scrolled back up, the marker location is n points too high. This is independent of the main view's size or the size of the visible area.

I can't seem to wrap my head around this problem; I guess there is a value I need to subtract from my result that expresses how far up the scrollview has been scrolled (or rather, how much further it can be scrolled down), but I don't think I can derive that value from myScrollView.documentVisibleRect...?

I may have overlooked something simple, but I can't find the solution.

Edit 2022-11-02 17:17 CET: Found the problem. I had set the NSRulerViews clientView to the contentView of the window. I am now setting it to the "main view" (ie. the view inside the scroll view), and now it works "automagically": I just set the marker locations to the subviews frame, no correction for scroll position or anything else needed.

fbitterlich
  • 882
  • 7
  • 24
  • 1
    Is the horizal marker correct if the view is scrolled horizontally? Have you tried `rulerMarkerDragTop.markerLocation = rect.origin.y`? – Willeke Nov 03 '22 at 15:18
  • Yes, horizontal works fine. `rulerMarkerDragTop`would need to be at ...origin.y + ...size.height, remember the view is flipped. But both variante exhibit(ed) the problem. But I have found the culprint now, see edit. – fbitterlich Nov 03 '22 at 16:16

1 Answers1

0

The solution was simple: the ruler views' clientView needs to be set to the view that is inside the scroll view, not the main content view of the window.

The positioning of the ruler markers is now very straightforward: you just use the local coordinates inside the view, ie. the subviews' frame values.

No correction for scroll position, view height or such necessary.

My mistake was assigning the window's main content view as the rulers' clientView.

fbitterlich
  • 882
  • 7
  • 24