Я пытаюсь создать NSScrollView, который отображает страницы документов. Я добавил NSView с поддержкой CALayer в качестве documentView NSScrollView, а затем добавил подуровень CALayer в documentView. Когда я увеличиваю масштаб NSScollview, documentView правильно увеличивается и уменьшается. Однако подслои documentView не масштабируются пропорционально их содержанию documentView. Если я не устанавливаю autoresizingMask на подслоях слоя documentView, подслои просто вылетают за пределы экрана при масштабировании documentView. Если я использую параметры LayerWidthSizable / LayerHeightSizable, подслои становятся намного больше или меньше, чем они должны быть относительно суперуровня documentView. Вот код, который у меня есть:
Вот NSScrollview:
class LayerScrollView: NSScrollView {
var containerLayer: ContainerLayer!
override func awakeFromNib() {
documentView = ContainerLayer(frame: frame)
}
}
Вот ContainerLayer (documentView CALayer):
class ContainerLayer: NSView {
let documentLayer: DocumentLayer = DocumentLayer()
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
autoresizesSubviews = true
wantsLayer = true
layer = CATiledLayer()
layer?.delegate = self
layer?.backgroundColor = NSColor.blueColor().CGColor
layer?.masksToBounds = true
documentLayer.frame = CGRect(x: frame.width / 4.0, y: frame.height / 4.0, width: frame.width / 2.0, height: frame.height / 2.0)
documentLayer.delegate = documentLayer
layer?.addSublayer(documentLayer)
documentLayer.autoresizingMask = CAAutoresizingMask.LayerWidthSizable | CAAutoresizingMask.LayerHeightSizable
documentLayer.setNeedsDisplay()
}
required init(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func drawLayer(layer: CALayer!, inContext ctx: CGContext!) {
CGContextSetFillColorWithColor(ctx, NSColor.redColor().CGColor)
CGContextFillRect(ctx, layer.bounds)
}
}
И, наконец, вот DocumentLayer (подслои, содержащиеся в DocumentLayer):
class DocumentLayer: CALayer {
override func drawLayer(layer: CALayer!, inContext ctx: CGContext!) {
CGContextSetFillColorWithColor(ctx, NSColor.redColor().CGColor)
CGContextFillRect(ctx, layer.bounds)
}
}
Вот изображение, иллюстрирующее проблему и мои желаемые результаты:
Синий прямоугольник - это ContainerLayer, красный прямоугольник - это DocumentLayer.
Я просмотрел множество руководств и документов и ничего не нашел. Похоже, это должно быть очень просто. Что мне здесь не хватает?