Как сохранить позицию прокрутки в NSScrollView при изменении масштаба?

Спасибо, я просто должен использовать:

SETLOCAL EnableExtensions

И помещенный a:

2^>nul

В QUERY REG, названную в команде FOR. Большое спасибо снова!:)

14
задан Olie 18 August 2009 в 22:29
поделиться

2 ответа

Нелегко сохранить ту же позицию прокрутки после масштабирования. Вам нужно решить, что вы подразумеваете под «одинаковым» - хотите ли вы, чтобы верх, середина или низ видимой области до масштабирования оставались на месте после масштабирования?

Или, что более интуитивно понятно, хотите ли вы положение, которое остается на месте, в процентах вниз по видимому прямоугольнику, равному проценту, на который вы прокручиваете документ при запуске (например, так, чтобы центр ползунка ползунка не перемещался вверх или вниз во время масштабирования, большой палец просто растет или сжимается).

Если вам нужен последний эффект, один из способов сделать это - получить verticalScroller и horizontalScroller NSScrollView, а затем прочитать их значения floatValue. Они нормализованы от 0 до 1, где «0» означает «вы». re вверху документа, а 1 означает, что вы в конце. Хорошая вещь в том, чтобы просить прокрутку об этом, заключается в том, что если документ короче, чем NSScrollView, прокрутка по-прежнему возвращает разумный ответ во всех случаях для 'floatValue', поэтому вам не нужно делать это в особом случае.

После изменения размера установите положение прокрутки NSScrollView на тот же процент, что и до масштабирования, но, к сожалению, здесь я немного машу руками. Я давно не делал этого в своем коде, но, насколько я помню, вы не можете просто установить floatValue NSScrollers напрямую - они будут СМОТРЕТЬ прокрученными, но на самом деле они не будут влиять на NSScrollView.

Итак , вам нужно будет написать математику, чтобы вычислить новую верхнюю левую точку в документе на основе процента, которое вы хотите пройти через нее - по оси Y, например, это будет выглядеть так: «Если документ теперь короче, чем contentView scrollView, прокрутите до точки 0, в противном случае прокрутите до точки, которая ((высота contentView - высота documentView) * oldVerticalPercentage) вниз по документу». Ось X, конечно же, аналогична.

Кроме того, я почти уверен, что вам здесь не нужен вызов -display, и вообще никогда не следует его вызывать. (-setNeedsDisplay: максимум.)

-Wil

и вообще никогда не должен это называть, никогда. (-setNeedsDisplay: максимум.)

-Wil

и вообще никогда не должен это называть, никогда. (-setNeedsDisplay: максимум.)

-Wil

11
ответ дан 1 December 2019 в 12:13
поделиться

Мне кажется, вам нравится слишком много печатать…; -)

// instead of this:
NSPoint oldCenter = NSPointFromCGPoint(CGPointMake(oldVisibleRect.origin.x +
    (oldVisibleRect.size.width  / 2.0),

// use this:
NSPoint oldCenter = NSMakePoint(NSMidX(oldVisibleRect), NSMaxY(oldVisibleRect));

// likewise instead of this:
[self scaleUnitSquareToSize:NSSizeFromCGSize(CGSizeMake(0.5, 0.5))];

// use this:
[self scaleUnitSquareToSize:NSMakeSize(0.5, 0.5)];

// and instead of this
NSPoint newOffset = NSPointFromCGPoint(CGPointMake(
    (oldCenter.x * 0.5) - (newVisibleRect.size.width  / 2.0),
    (oldCenter.y * 0.5) - (newVisibleRect.size.height / 2.0)));

// use this:
NSPoint newOffset NSMakePoint(
    (oldCenter.x - NSWidth(newVisibleRect)) / 2.f,
    (oldCenter.y - NSHeight(newVisibleRect)) / 2.f);
7
ответ дан 1 December 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: