Как интерпретировать жесты сжатия трекпада для увеличения IKImageBrowserView

У меня есть IKImageBrowserView, который я хочу масштабировать с помощью мультисенсорного трекпада на последнем ноутбуке Mac.

Руководство по обработке событий Cocoa, в разделе Обработка событий жестов говорит:

Метод доступа к увеличению возвращает значение с плавающей запятой (CGFloat), представляющее коэффициент увеличения

..и продолжает показывать код, который регулирует размер представления, умножая высоту и ширину на magnification + 1.0.

Это не кажется правильным подходом для масштабирования IKImageBrowserView, чье свойство zoomValue ограничено между 0,0 и 1,0.

Итак, кто-нибудь знает, как интерпретировать событие в -[NSResponder magnifyWithEvent:] для увеличения IKImageBrowserView?


person Fraser Speirs    schedule 27.11.2009    source источник


Ответы (2)


Вот что я делаю на Snow Leopard, все работает отлично:

В 10.6 у NSEvent есть метод «увеличение», который уже возвращает нужное количество. Все, что вам нужно сделать, это добавить это к старому значению, например [imageBrowser zoomValue]+[event magnification].

- (void)magnifyWithEvent:(NSEvent *)event
{
    if ([event magnification] > 0)
    {
        if ([self zoomValue] < 1)
        {
            [self setZoomValue:[self zoomValue] + [event magnification]];
        }
    }
    else if ([event magnification] < 0)
    {
        if ([self zoomValue] + [event magnification] > 0.45)
        {
            [self setZoomValue:[self zoomValue] + [event magnification]];
        }
        else
        {
            [self setZoomValue:0.45];
        }
    }
}

self здесь является подклассом IKImageBrowserView. У меня есть пороговое значение, так что zoomValue не может быть меньше 0,45, но мне это нравится.

С уважением, Матиас, Eternal Storms Software

person Matthias Gansrigler    schedule 27.11.2009

Если вы добавите увеличение события к коэффициенту масштабирования, одно и то же событие не будет иметь такого же эффекта в зависимости от текущего коэффициента масштабирования. Добавление увеличения 0.1 к коэффициенту масштабирования 1 приведет к увеличению на 10%, но если коэффициент масштабирования равен 0.1, добавление 0.1 удвоит масштаб.

Результат умножения коэффициента масштабирования на magnification + 1.0 будет более последовательным.

Я предпочитаю умножать коэффициент масштабирования на std::exp(magnification), так как это кажется более естественным решением. Увеличение -n уменьшит масштаб точно на ту же величину, что и увеличение n.

person Thomas    schedule 04.05.2010