如何在Cocoa AppKit应用程序中实现缩放/缩放

fin*_*son 7 macos cocoa zoom appkit

如何在Cocoa AppKit应用程序中实现缩放/缩放(即不是最大化窗口而是缩放窗口及其所有子视图)?我认为它在iOS中称为zoomScale.它可以使用Core Animations或Quartz 2D(例如CGContextScaleCTM)完成,还是我被迫在我的所有NSView,NSCell等中手动实现它?

Jon*_*ess 12

每个NSView都有一个边界和框架,框架是描述视图在其超视图边界内的位置的矩形.大多数视图都有一个零起点的边界,以及与其框架大小相匹配的大小,但不一定是这种情况.您可以更改视图边界和框架的关系以缩放并转换自定义绘图和子视图.更改视图的边界时,它还会以递归方式影响后代视图的绘制.

更改视图边界的最直接方法是 - [NSView scaleUnitSquareToSize:].在您的一个视图中,尝试调用[self scaleUnitSquareToSize:NSMakeSize(2.0,2.0)],您应该看到其中的所有内容的大小看起来是双倍的.

这是一个例子.使用包含自定义视图和按钮的窗口创建XIB文件.将自定义视图的自定义类设置为MyView.将按钮的操作连接到视图的doubleSize:操作.构建并运行并按下按钮.每次按下时,自定义视图中的红色方块的大小应加倍.

/// 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
Run Code Online (Sandbox Code Playgroud)