objective-c - NSScrollView 剪辑文档 View 而不是允许它滚动

标签 objective-c macos cocoa swift

我有自定义的、层支持的 NSView 作为 NSScrollView 的文档 View 。 ScrollView 位于 NSSplitView 内,它本身使用约束来确保它填充整个窗口。

自定义 View 的边界从未明确设置。然而,在某一时刻,背衬层的边界被设置为包含每个子层。明确设置边界没有帮助。

当我调整窗口大小时, ScrollView 剪辑我的自定义 View ,我发现自己无法滚动:

Scroll view clipping contents

当我调试我的 View 时,我发现调整窗口大小也会调整自定义 View 框架的大小。我真的不知道这是否正常。我的自动调整大小掩码是 .ViewMinYMargin,如果关闭,则 translatesAutoresizingMaskIntoConstraints(但如果我打开它,它似乎没有任何改变)。

考虑到在 Apple guide 中基本上没有关于如何使滚动工作的说明。 ,我一定错过了一些相当简单的东西。有人知道吗?

最佳答案

发生这种情况是因为对自动布局约束的误解。自定义 View 的每个边缘都被限制为与剪辑 View 边缘的距离为 0。这有效地将 View 的大小设置为裁剪 View 的大小,防止滚动,因为它使裁剪后的大小看起来像是自定义 View 的自然大小。

解决方案是仅约束左、上和右边缘,并保留下边缘。相反,我对自定义 View 进行了 height 约束,并以编程方式将其 constant 值设置为我的 View 内容(动态生成)的大小。

LayerBackedView 示例代码:

class LayerBackedView: NSView {
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        self.wantsLayer = true
    }

    override var flipped: Bool {
        // hug top of scroll view if not high enough to fill it entirely
        return true
    }

    private var heightConstraint: NSLayoutConstraint {
        let firstConstraint = constraints[0] as! NSLayoutConstraint
        assert(firstConstraint.firstAttribute == .Height)
        return firstConstraint
    }

    override func awakeFromNib() {
        let red = CALayer()
        red.anchorPoint = CGPointMake(0, 0)
        red.backgroundColor = CGColorCreateGenericRGB(1, 0, 0, 1)
        red.borderWidth = 2
        red.borderColor = CGColorCreateGenericGray(0, 1)
        layer!.addSublayer(red)

        // set height constraint to whatever you need it to be
        let desiredHeight: CGFloat = 200
        heightConstraint.constant = desiredHeight
        red.frame = CGRectMake(0, 0, bounds.width, desiredHeight)
    }
}

LayerBackedView 上的约束(高度值无关紧要,因为我们以编程方式更改它,约束只需要存在):

Constraints needed on the custom view

尺寸约束被添加到 View 本身,但间距约束被添加到父 View 。这意味着在四个约束中,高度约束将是 View 内的唯一约束(这就是为什么我们可以做 constraints[0] as! NSLayoutConstraint)。如果这不是你的情况,你可以为它创建一个 @IBOutlet

关于objective-c - NSScrollView 剪辑文档 View 而不是允许它滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28727002/

相关文章:

iphone - 旋转肖像 UIImage 具有 UIImageOrientationRight 方向

ios - 为iOS中的特定部分文本设置斜体文本

objective-c - NSTimer 可能的崩溃原因

cocoa - 在一台用户 10.6.8 机器上崩溃,并将无法识别的选择器发送到类(class)

objective-c - 使用 NSWindowController 动画打开一个新窗口

objective-c - 在不丢失 iPod 音乐的情况下播放加载动画

ios - 如何在 drawRect 中设置圆角半径

c - 如何使用 ptrace() 观察进程直到它退出?

python - gevent 无法在 OS X Capitan 上的 python 虚拟环境中安装

ruby - 为特定目录 (RVM) 设置默认的 Ruby 版本