Как реализовать масштабирование в AppKit-приложении Cocoa - PullRequest
7 голосов
/ 09 апреля 2011

Как реализовать масштабирование в AppKit-приложении Cocoa (т.е. не максимизировать окно, а масштабировать окно и все его подпредставления)?Я думаю, что это называется zoomScale в iOS.Можно ли это сделать с помощью Core Animations или Quartz 2D (например, CGContextScaleCTM), или я вынужден применять его вручную во всех моих NSViews, NSCells и т. Д.?

1 Ответ

12 голосов
/ 09 апреля 2011

Каждый NSView имеет границы и рамки, рамка - это прямоугольник, который описывает расположение представления в границах его суперпредставления.У большинства представлений есть границы с нулевым началом и размером, соответствующим размеру их кадра, но это не обязательно так.Вы можете изменить соотношение границ и рамки вида для масштабирования и перевода как пользовательского чертежа, так и подпредставлений.Когда вы изменяете границы вида, это также рекурсивно влияет на отрисовку дочерних видов.

Самый простой способ изменить границы вида - с помощью [NSView scaleUnitSquareToSize:].В одном из ваших представлений попробуйте вызвать [self scaleUnitSquareToSize: NSMakeSize (2.0, 2.0)], и вы увидите, что размер всего, что внутри него, кажется двойным.Создайте файл XIB с окном, содержащим пользовательский вид, и кнопкой.Установите пользовательский класс пользовательского представления в MyView.Подключите действие кнопки к представлению doubleSize: action.Постройте и запустите и нажмите кнопку.Красный квадрат в пользовательском представлении должен увеличиваться в размере при каждом нажатии.

/// MyView.h
@interface MyView : NSView {
}
- (IBAction)doubleSize:(id)sender;
@end

/// MyView.m
@implementation MyView
- (IBAction)doubleSize:(id)sender {
    [self scaleUnitSquareToSize:NSMakeSize(2.0, 2.0)];
    /// Important, changing the scale doesn't invalidate the display
    [self setNeedsDisplay:YES];
}

- (void)drawRect:(NSRect)dirtyRect {
    NSSize squareSize = NSMakeSize(8, 8);
    NSRect square = NSMakeRect([self bounds].size.width / 2 - squareSize.width / 2, 
                               [self bounds].size.height / 2 - squareSize.height / 2,
                               squareSize.width,
                               squareSize.height);
    [[NSColor redColor] set];
    NSRectFill(square);
}
@end
...