NSImageView и CAShapeLayer


#1

Есть кастомный NSImageView. Загружаем в него фото и затем рисуем в NSImageView с помощью CAShapeLayer прямоугольник. Т.е. на экране видим фото с нарисованным на нем прямоугольником. Когда хотим распечатать то печатается только фото без прямоугольника.

Вопрос. Как сделать чтобы image который шел на печать был составлен из нашего фото и прямоугольника ?


#2

Добрый вечер коллеги.
Возвратился к не решенному вопросу.
Попробовал следующую логику. Не работает. Ошибка возникает на этапе добавления родительского слоя.
Может кто видит что не так. Нужна ваша помощь !!

    //Имеем массив CAShapeLayer - прямоугольников. Создаем родительский CALayer и добавляем в него наши прямоугольники. 
    let arrayOfSelectedRectangels = gelImageAnalysis.arrayOfSelectedRectangles
    let arrayOfNumbersForRectangles = gelImageAnalysis.arrayOfTextLayersNumbers
    
    let parentLayer = CALayer()

    for each in arrayOfSelectedRectangels
    {
        parentLayer.addSublayer(each)
    }

    for each in arrayOfNumbersForRectangles
    {
        parentLayer.addSublayer(each)
    }
    
    //Берем картинку из NSImageView и получаем CGimage и CGRect для него.
    let rect = CGRect(origin: CGPoint.zero,
                      size: CGSize(width: (gelImageAnalysis.image?.size.width)!, height: (gelImageAnalysis.image?.size.height)!))
    let cgImageOfGel = gelImageAnalysis.image?.cgImage(forProposedRect: nil, context: nil, hints: nil)
    
    //создаем cgContext и рисуем в нем cgImageOfGel
    let context = NSGraphicsContext.current?.cgContext
    context?.draw(cgImageOfGel!, in: rect)
    
    //рисуем в cgContext родительский слой        
    parentLayer.render(in: context!)
    
    //получаем из cgContext cgImage
    let cgImageOfGelWithRectangles = context?.makeImage()
    
    //конвертируем CGImage в NSImage
    let newNSImageForPrint = NSImage.init(cgImage: cgImageOfGelWithRectangles!, size: (gelImageAnalysis.image?.size)!)
    
    //втавслянм NSImage в NSImageView
    gelImageAnalysis.image = newNSImageForPrint
    
    //Печатаем то что в NSImage

#3

Может так?

class ImageView: NSImageView {
    
    private let parent = CALayer()
    
    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
        parent.frame.size = dirtyRect.size
        parent.sublayers?.forEach { $0.removeFromSuperlayer() }
        for i in 0..<5 {
            let shape = CAShapeLayer()
            shape.path = CGPath(roundedRect: CGRect(x: CGFloat(i) * 60, y: 200, width: 50, height: 50), cornerWidth: 25, cornerHeight: 25, transform: nil)
            shape.fillColor = NSColor.red.cgColor
            parent.addSublayer(shape)
        }
        
        let context = NSGraphicsContext.current!
        
        if context.isDrawingToScreen {
            layer!.addSublayer(parent)
        } else {
            parent.render(in: context.cgContext)
        }
    }
}

У меня что то такое получается:

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


#4

Спасибо !
Попробовал добавить последнюю часть из Вашего кода в свой NSImageView. Работает. В окне для печати есть и фото и прямоугольники.
Есть только одно но, при вызове окна для принта прямоугольники исчезают с окна NSImageView. У Вас судя по картинке все на месте. Буду разбираться.

Update.
Исправил, все работатет как надо ! Еще раз спасибо!