Как дать NSOutlineView мозаичное фоновое изображение, которое прокручивается? - PullRequest
0 голосов
/ 27 мая 2020

У меня стандартная NSOutlineView. Я хотел бы, чтобы у него было фоновое изображение, которое мозаично расположено по вертикали и которое прокручивается вместе с ячейками представления контура.

Я несколько добился этого, используя следующее в моем ViewController:

class ViewController: NSViewController {

    @IBOutlet weak var outlineView: NSOutlineView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        if let image = NSImage(named: "tile") {
            let color = NSColor.init(patternImage: image)
            outlineView.backgroundColor = color
        }
    }
}

Это работает, за исключением случаев, когда вы прокручиваете верхнюю или нижнюю часть представления (с растяжением, обеспечиваемым содержащим прокрутку).

enter image description here

Я пробовал поместить фоновое изображение в представление прокрутки, но тогда оно имеет c и не прокручивается вместе с содержимым представления контура.

Я также пробовал создавать подклассы различных объектов в иерархии представлений и переопределив их метод draw(_ dirtyRect: NSRect) и выполнив:

self.wantsLayer = true
self.layer?.backgroundColor = ...etc

, но и от этого не добился успеха.

Может ли кто-нибудь дать какие-либо предложения?

1 Ответ

0 голосов
/ 15 июля 2020

В итоге я создал новый настраиваемый NSView:

class MyView: NSView {

    override func draw(_ dirtyRect: NSRect) {
        if let image = NSImage(named: "Tile") {
            let color = NSColor.init(patternImage: image)
            color.setFill()
            dirtyRect.fill()
        }

        super.draw(dirtyRect)
    }
}

Затем в моем классе ViewController я добавил экземпляр настраиваемого представления и использовал ограничения автоматического размещения, чтобы закрепить новое представление на моем Представление клипа в программе outlineView начинается на 2000 точек над ним и заканчивается на 2000 точек ниже. Это означает, что независимо от того, как далеко вы переместитесь в область растяжения, вы все равно увидите мозаичный фон.

class MyViewController: NSViewController {
    @IBOutlet weak var outlineView: NSOutlineView!

    override func viewDidLoad() {
        super.viewDidLoad()
        guard let clipView = self.outlineView.superview else { return }

        let newView = MyView(frame: .zero) // Frame is set by autolayout below.
        newView.translatesAutoresizingMaskIntoConstraints = false

        clipView.addSubview(newView, positioned: .below, relativeTo: self.outlineView)

        // Add autolayout constraints to pin the new view to the clipView.
        // See https://apple.co/3c6EMcH
        newView.leadingAnchor.constraint(equalTo: clipView.leadingAnchor).isActive = true
        newView.widthAnchor.constraint(equalTo: clipView.widthAnchor).isActive = true
        newView.topAnchor.constraint(equalTo: clipView.topAnchor, constant: -2000).isActive = true
        newView.bottomAnchor.constraint(equalTo: clipView.bottomAnchor, constant: 2000).isActive = true
    }
}

Я удалил другой код из приведенного выше, поэтому, надеюсь, я оставил все необходимое для иллюстрации решение.

...