【发布时间】:2011-04-09 08:12:03
【问题描述】:
如何在 Cocoa AppKit 应用程序中实现缩放/缩放(即不是最大化窗口,而是缩放窗口及其所有子视图)?我认为它在 iOS 中称为 zoomScale。是否可以使用 Core Animations 或 Quartz 2D(例如 CGContextScaleCTM)来完成,还是我必须在所有 NSView、NSCell 等中手动实现它?
【问题讨论】:
标签: cocoa macos zooming appkit
如何在 Cocoa AppKit 应用程序中实现缩放/缩放(即不是最大化窗口,而是缩放窗口及其所有子视图)?我认为它在 iOS 中称为 zoomScale。是否可以使用 Core Animations 或 Quartz 2D(例如 CGContextScaleCTM)来完成,还是我必须在所有 NSView、NSCell 等中手动实现它?
【问题讨论】:
标签: cocoa macos zooming appkit
每个 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
【讨论】: