Центрировать NSView в NSScrollView

Как мне центрировать NSView в NSScrollView, как это делает «Предварительный просмотр»?


person rhombus    schedule 20.11.2009    source источник


Ответы (2)


Прочтите Scroll View Programming Guide о прокрутке до определенной позиции. Там есть примеры для верха или низа. Вы просто изменили бы математику, чтобы вычислить происхождение на основе середины вашего NSView. Что-то типа:

-(void)scrollToCenter:(NSScrollView*)scrollView
{
    const CGFloat midX = NSMidX([[scrollView documentView] bounds]);
    const CGFloat midY = NSMidY([[scrollView documentView] bounds]);

    const CGFloat halfWidth = NSWidth([[scrollView contentView] frame]) / 2.0;
    const CGFloat halfHeight = NSHeight([[scrollView contentView] frame]) / 2.0;

    NSPoint newOrigin;
    if([[scrollView documentView] isFlipped])
    {
        newOrigin = NSMakePoint(midX - halfWidth, midY + halfHeight);
    }
    else
    {
        newOrigin = NSMakePoint(midX - halfWidth, midY - halfHeight);
    }

    [[scrollView documentView] scrollPoint:newOrigin];
}
person nall    schedule 21.11.2009
comment
Это не работает, когда вид документа меньше, чем вид прокрутки. Представление документа закреплено внизу слева (или вверху слева, если перевернуто). - person Nicolas Miari; 04.11.2013

В Свифте:

extension NSScrollView {
    func scrollToCenter() {
        guard let docView = documentView else { return }
        let center = CGPoint(
            x: docView.bounds.midX - contentView.frame.width / 2,
            y: docView.bounds.midY - (docView.isFlipped ? -1 : 1) * contentView.frame.height / 2
        )
        docView.scroll(center)
    }
}
person duan    schedule 13.11.2018