NSScrollView缩放子视图

时间:2012-10-02 16:27:00

标签: macos zoom nsview nsscrollview

为noob问题道歉 - 来自iOS背景我在OSX上苦苦挣扎。

好消息 - 我有一个带有大型NSView的NSScrollView,因为它是documentView。我一直在调整contentView的边界以有效地放大documentView - 所有这些都适用于我在drawRect(documentView)中做的任何事情

不太好的消息 - 我现在已经添加了另一个NSView作为大型documentView的孩子,并期望它只是像在iOS版本中那样进行缩放 - 但事实并非如此。如果有人能帮助填补我对这一切的理解中的相当大的差距,我将非常感激

感谢。

[更新]自行修复 - “问题”是启用了自动布局(布局约束)。一旦我禁用它们并适当地设置自动调整,那么一切都很好。我想我应该学习布局约束......

2 个答案:

答案 0 :(得分:0)

大笑,我有完全相同的问题。我失去了两天乱搞自动布局。在我读完你的更新之后,我进去了,只是在视图中添加了另一个NSBox,它被正确绘制并缩放。

虽然,它也可以作为子视图用于NSImageViews吗?

答案 1 :(得分:0)

我知道这已经很老了,但是在花了几天时间尝试使用其他人发布的各种解决方案来解决这个问题后,我才使用以下工具实现了鼠标滚动缩放,所有这些都有根本性的问题。作为背景,我在一个NSView子类中使用CALayers,该CALayers在背景中具有大型PDF建筑布局,并且超过了100个可拖动的CALayer对象。

变焦是即时且平滑的,并且一切都可以完美地缩放,并且没有所谓的“放大”所带来的像素化。我为此浪费了很多天。

  override func scrollWheel(with event: NSEvent) {

        guard event.modifierFlags.contains(.option) else {
            super.scrollWheel(with: event)
            return
        }

        let dy = event.deltaY
        if dy != 0.0 {

            let magnification = self.scrollView.magnification + dy/30
            let point = self.scrollView.contentView.convert(event.locationInWindow, from: nil)

            self.scrollView.setMagnification(magnification, centeredAt: point)
        }
    }