我有自定义的、层支持的 NSView
作为 NSScrollView
的文档 View 。 ScrollView 位于 NSSplitView
内,它本身使用约束来确保它填充整个窗口。
自定义 View 的边界从未明确设置。然而,在某一时刻,背衬层的边界被设置为包含每个子层。明确设置边界没有帮助。
当我调整窗口大小时, ScrollView 剪辑我的自定义 View ,我发现自己无法滚动:
当我调试我的 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
上的约束(高度值无关紧要,因为我们以编程方式更改它,约束只需要存在):
尺寸约束被添加到 View 本身,但间距约束被添加到父 View 。这意味着在四个约束中,高度约束将是 View 内的唯一约束(这就是为什么我们可以做 constraints[0] as! NSLayoutConstraint
)。如果这不是你的情况,你可以为它创建一个 @IBOutlet
。
关于objective-c - NSScrollView 剪辑文档 View 而不是允许它滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28727002/