【问题标题】:How to implement zoom/scale in a Cocoa AppKit-application如何在 Cocoa AppKit 应用程序中实现缩放/缩放
【发布时间】:2011-04-09 08:12:03
【问题描述】:

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

【问题讨论】:

    标签: cocoa macos zooming appkit


    【解决方案1】:

    每个 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
    

    【讨论】:

    • 我正在尝试让这个工作适用于有很多子视图的视图。我正在应用它的视图正在缩放,但子视图保持相同的大小。它们也应该扩展吗?
    • 我希望它们占据的屏幕区域会改变大小,但它们各自的框架矩形应该保持不变。
    • 我看到的是子视图的视觉大小保持不变,即使我正在缩放的​​视图大小增加或缩小。
    • 子视图由层支持这一事实是否会产生影响?
    • 我尝试关闭视图层次结构的层,实际上,重新调整大小开始表现得更好。我仍然有一些问题,但我认为它们与我的视图呈现自己的方式有关。
    猜你喜欢
    • 2011-01-12
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2011-05-31
    • 2012-04-13
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    相关资源
    最近更新 更多