Отсутствуют кнопки в диалоговом окне AirPrint

Я реализовал AirPrinting из своего приложения, но столкнулся со странной проблемой. Всякий раз, когда появляется диалоговое окно печати, кнопки «Отмена» или «Готово/Печать» не отображаются, как показано на следующем рисунке.

введите здесь описание изображения

Код, который я использую, выглядит следующим образом:

if ([UIPrintInteractionController canPrintURL:pdfUrl]) {  
        UIPrintInfo *aPrintInfo = [UIPrintInfo printInfo];  
        aPrintInfo.outputType = UIPrintInfoOutputGeneral;  
        aPrintInfo.jobName = [NSString stringWithFormat:@"%@-PRINT",[[NSUserDefaults standardUserDefaults] stringForKey:@"Kiosk ID"]];  
        UIPrintInteractionController *aPrintController = [UIPrintInteractionController sharedPrintController];  
        aPrintController.showsNumberOfCopies=YES;  
        aPrintController.showsPaperSelectionForLoadedPapers=YES;  
        aPrintController.printingItem = pdfUrl;  
        aPrintController.printInfo = aPrintInfo;  
        [aPrintController presentAnimated:YES completionHandler:NULL];  
}  

Кто-нибудь сталкивался с этой проблемой и знает, как исправить? Что действительно странно, так это то, что действия для этих скрытых кнопок все еще работают; поэтому, если я нажму там, где должна быть кнопка печати, она будет напечатана, и я также могу закрыть диалоговое окно, нажав в левом верхнем углу, где должна быть кнопка «Отмена».

Ваше здоровье!

PS при использовании последней версии IOS 11 проблема возникает в симуляторе и на устройстве.

[Изменить] Я только что протестировал пример печати от Apple, найденный по адресу https://developer.apple.com/library/content/samplecode/PrintBanner/Introduction/Intro.html#//apple_ref/doc./uid/DTS40013422-Intro-DontLinkElementID_2

и хотя код для вызова диалогового окна AirPrint очень похож (особенно после того, как я немного подправил свой код), демонстрационный код работал, как и ожидалось (кнопки видны), а мой код по-прежнему не работает. Очень запутанно.

[Редактировать 2] Использование приведенного выше примера кода в новом проекте также работает, как и ожидалось. Тем не менее, в моем полном приложении это не так. У кого-нибудь есть опыт, почему это мое? Возможно, на системные диалоги влияет размер приложения? Маловероятно, но с моим приложением, использующим этот код, определенно что-то не так, и это неочевидно.

[Редактировать 3] Я улучшил новый проект, постепенно добавляя те же элементы из моего основного проекта, вплоть до добавления тех же модулей и настройки той же структуры пользовательского интерфейса и добавления элементов UIImage. У него не было точно такого же количества просмотров, и они не выполняли те же действия, что и мой основной проект, но использование памяти было аналогичным. И тем не менее, это сработало. Являются ли повреждения рабочей области вещью в Xcode, чем-то за кулисами, не представленным ни в одном пользовательском интерфейсе, который мог бы объяснить это?

[Редактировать 4] Я только что создал совершенно новый проект, переустановил все модули, а затем переместил исходные файлы из исходного проекта в новый проект. Успокойте сюрприз, проблема все еще остается в новом проекте.

[Изменить 5] Решено! Наконец-то я нашел проблему, отчасти благодаря подсказке из принятого ответа ниже. Это произошло из-за того, что глобальный цвет оттенка был установлен на Clear, но также имелись отдельные представления в каждом контроллере, которые также устанавливали цвет оттенка на Clear. Это повлияло на отображаемый диалог, и поэтому кнопки были невидимы. Как только я изменил Views, чтобы иметь фактический цвет для свойства Tint, кнопки диалога печати снова стали видны.


person Snouto    schedule 08.01.2018    source источник
comment
Использует ли ваш код UIAppearance? Отладчик представления показывает кнопки?   -  person EricS    schedule 11.01.2018
comment
У меня нет прямого опыта работы с UIAppearance, но я быстро просматриваю его, класс UIPrintInteractionController, похоже, не имеет селектора внешнего вида. Это может быть связано с тем, что это системный диалог, или вы думали о чем-то другом?   -  person Snouto    schedule 11.01.2018
comment
Вы можете нажимать на кнопки, даже если они не видны?   -  person atulkhatri    schedule 11.01.2018
comment
Да, я упоминал об этом в ОП.   -  person Snouto    schedule 11.01.2018
comment
Я подумал, может быть, вы использовали UIAppearance в той части вашего приложения, которая влияла на это представление.   -  person EricS    schedule 11.01.2018
comment
Я согласен с комментарием @EricS. Похоже, вы настраиваете цвет шрифта в своем UIAppearance. Что вы можете сделать, зайдите в UIDebugger и проверьте кнопки во всплывающем окне. Выберите кнопку, вы можете увидеть свойства, там вы можете найти цвет шрифта кнопки.   -  person Pallavi Srikhakollu    schedule 12.01.2018
comment
Код показан выше, я нигде не устанавливаю цвета кнопок для этого диалога. Тем не менее, я посмотрю на использование UIDebugger, возможно, он покажет что-то полезное.   -  person Snouto    schedule 12.01.2018
comment
К сожалению, и, вероятно, из-за того, что диалоговое окно печати является системным диалоговым окном, UIDebugger не показывает ничего общего с диалоговым окном печати, поэтому я вообще не вижу, как оно представлено.   -  person Snouto    schedule 12.01.2018
comment
Ваши комментарии заставили меня исследовать другую область моего проекта, которая действительно настраивает цвет UIAlertController. Я попытался удалить этот код и перестроить, и даже включить его в свой тестовый проект, но в обоих случаях результат был одинаковым. UIPrintInteractionController наследуется от NSObject, а не от UIAlertController, поэтому, возможно, именно поэтому код не влияет на мою проблему... но все равно заставляет задуматься, не происходит ли что-то внизу.   -  person Snouto    schedule 15.01.2018


Ответы (2)


Прямой проблемы с кодом UIPrintInteractionController нет. Как вы упомянули, кнопки «Готово» и «Отмена» работают должным образом. Единственная проблема - видимость кнопок.

Попробуйте изменить цвет оттенка панели навигации, прежде чем представлять контроллер печати.

self.navigationBar.barStyle = UIBarStyle.Black
self.navigationBar.tintColor = .black

Примечание: - У меня нет вашего кода. Это только одна из проблем и решений, связанных с вашей проблемой.

person Chanchal Warde    schedule 16.01.2018
comment
Спасибо за ответ, но использование self.navigationController.navigationBar.barStyle=UIBarStyleBlack; self.navigationController.navigationBar.tintColor=UIColor.blackColor; не решило проблему. - person Snouto; 16.01.2018
comment
Привет, snouto, я столкнулся с этой проблемой в контроллере Image Picker. Вы используете панель навигации по умолчанию ?? - person Chanchal Warde; 16.01.2018
comment
У меня есть навигационный контроллер в моем приложении, но он скрыт, панель навигации не отображается. несмотря на это, я попробовал ваш код, и он не решил проблему для меня. - person Snouto; 16.01.2018
comment
Вы отлаживали в разных версиях ОС ?? - person Chanchal Warde; 16.01.2018
comment
Это системный диалог, поэтому я не могу отлаживать его напрямую. Но я всегда запускаю код на одном и том же устройстве и версии iOS. - person Snouto; 17.01.2018
comment
Хорошо, я, наконец, нашел проблему, это было связано с тем, что глобальный цвет оттенка был установлен на «Очистить», но также и с отдельными представлениями в каждом контроллере, установленными для цвета оттенка, чтобы очистить его. Как только я изменил все представления, чтобы иметь фактический цвет для свойства Tint, кнопки диалога печати снова стали видны, и это было очень радостно. Я рад принять ваш ответ, поскольку он был - по сути - правильным. Спасибо за помощь! - person Snouto; 17.01.2018
comment
Рад, что вам помогло :) - person Chanchal Warde; 17.01.2018

Я также использовал ваш код, и он работает, как и ожидалось, в iOS 11 также есть кнопка отмены и печати. Вот код

([UIPrintInteractionController canPrintURL:self.pdfUrl]) {
        UIPrintInfo *aPrintInfo = [UIPrintInfo printInfo];
        aPrintInfo.outputType = UIPrintInfoOutputGeneral;
        aPrintInfo.jobName = @"test job";
        UIPrintInteractionController *aPrintController = [UIPrintInteractionController sharedPrintController];
        aPrintController.showsNumberOfCopies=YES;
        aPrintController.showsPaperSelectionForLoadedPapers=YES;
        aPrintController.printingItem = self.pdfUrl;
        aPrintController.printInfo = aPrintInfo;
        [aPrintController presentAnimated:YES completionHandler:NULL];
    }

Пожалуйста, проверьте, имеет ли pdfUrl действительный URL-адрес, также в пользовательском интерфейсе pdf должен загрузиться, если это действительный URL-адрес.

Ниже приведен URL-адрес, который я использую

self.pdfUrl = [NSURL URLWithString:@"http://unec.edu.az/application/uploads/2014/12/pdf-sample.pdf"];

Изменить 1: -

Прикрепляю снимок экранавведите здесь описание изображения

person Gyanendra    schedule 10.01.2018
comment
Спасибо за ответ, но это ничего не решает для меня. 1) мой PDF-файл определенно существует локально, потому что а) я создаю его перед печатью и б) он отлично печатается, и 2) я даже попробовал ссылку на ваш PDF-файл выше, и результат был таким же: ibb.co/b8gcRm - person Snouto; 11.01.2018
comment
это действительно странно, потому что с тем же URL-адресом я могу получить экран с кнопкой отмены и печати. Я приложу снимок осыпи для того же самого. - person Gyanendra; 11.01.2018
comment
Возможно, вам следует попытаться преобразовать его в NSData и попробовать распечатать, если pdf хранится локально - person Gyanendra; 11.01.2018
comment
Я думаю, что это что-то более фундаментальное, возможно, даже мое рабочее пространство где-то испортилось. Я создал вторичный проект и постепенно добавлял те же элементы из моего основного проекта, вплоть до добавления тех же модулей и настройки той же структуры пользовательского интерфейса, а также добавлял элементы UIImage, чтобы использование памяти было одинаковым. И тем не менее, это сработало. Я не могу это объяснить. - person Snouto; 11.01.2018
comment
Пожалуйста, начните использовать новый проект :) - person Gyanendra; 11.01.2018