Изображение IKImageView не отображается во время печати

У меня есть NSSplitView с двумя IKImageView с обеих сторон, чтобы сравнить их друг с другом. Я пытаюсь реализовать функцию печати, но изображения исчезают при предварительном просмотре. (Что следует печатать по сравнению с Что я получаю)

Что я пробовал:

На основе docs, фиксируя фокус на splitView и напрямую печатая его с помощью

[[NSPrintOperation printOperationWithView:view] runOperation];

Но пока в документах указано, что

Если пользовательский интерфейс содержит несколько представлений, у которых может быть фокус, печать на основе представлений не работает.

Я попытался сделать «скриншот» (метод 1, Метод 2) из splitView, создание нового viewController с одним NSImageView, отображение моего снимка экрана, а затем печать imageView. Но изображения не были видны даже на скриншоте.

Важно то, что печать работает нормально, если я использую NSImageViews вместо IKImageViews.

Что еще я могу попробовать? (Подойдут оба решения objective-c и swift)


person arsena    schedule 18.08.2016    source источник
comment
Разве это не просто вопрос создания указателя и последующего назначения объекта IKImageView методу операции печати, поскольку IKImageView является подклассом NSView?   -  person El Tomato    schedule 18.08.2016
comment
@ElTomato У меня есть два IKImageViews, расположенных рядом в NSSplitView, и мне нужно напечатать оба вместе.   -  person arsena    schedule 19.08.2016
comment
@Willeke Пробовал, но получаю исключение в неуправляемом коде при вызове img.Draw.   -  person arsena    schedule 19.08.2016
comment
Распечатать временный разделенный вид с помощью NSImageViews?   -  person Willeke    schedule 20.08.2016
comment
Я думал именно об этом, но хочу попробовать все другие возможности, прежде чем принимать радикальное решение :d   -  person arsena    schedule 21.08.2016
comment
@Willeke Наконец-то я сделал это. Вы можете проверить ответ   -  person arsena    schedule 22.08.2016


Ответы (1)


Наконец-то нашел обходной путь (также учитывается уровень масштабирования). Я получаю NSImages из IKImageViews, передаю их новому ViewController, где показываю предварительный просмотр того, что будет напечатано. В этом контроллере просмотра у меня есть простой NSView(rootView) с двумя NSImagesViews рядом. Я установил свои изображения с IkImageViews на NSImageViews, а затем распечатал rootView.

Вот как я получаю NSImages из IkImageViews:

Шаги: получить видимый/обрезанный/увеличенный прямоугольник из IkImageView; Создать NSImage из IKImageView's CGImageRef; Создайте новый NSImage и нарисуйте в нем обрезанное изображение.

Примечание. синтаксис obj-c может быть немного неправильным, я никогда раньше не писал ни одной строки obj-c (Xamarin Developer).

Цель-c:

NSRect croppedRect = [imageView convertViewRectToImageRect:[imageView visibleRect]];
NSImage srcImage = [[NSImage alloc] initWithCGImage:[imageView image] size:NSZeroSize];
NSImage croppedImage = [[NSImage alloc] initWithSize:croppedRect.size];
[croppedImage lockFocus];
[srcImage drawAtPoint:NSZeroPoint
          fromRect:croppedRect
          operation:NSCompositeCopy
          fraction:1.0];
[croppedImage unlockFocus];
return croppedImage;

C# (Xamarin):

NSImage GetImageToPrint()
    {
        var cropRect = LeftImage.ConvertViewRectToImageRect(LeftImage.VisibleRect());

        NSImage srcImage = new NSImage(LeftImage.Image, LeftImage.ImageSize);
        NSImage croppedImage = new NSImage(cropRect.Size);
        croppedImage.LockFocus();
        srcImage.Draw(CGPoint.Empty, cropRect, NSCompositingOperation.Copy, 1.0f);
        croppedImage.UnlockFocus();

        return croppedImage;
    }

Надеюсь, кто-нибудь найдет ответ полезным.

person arsena    schedule 22.08.2016
comment
[croppedRect lockFocus] должно быть [croppedImage lockFocus]? - person Willeke; 23.08.2016