Как распечатать UIWebView через UIActivityViewController?

У меня есть контроллер представления, содержащий UIWebView и панель инструментов с кнопкой действия/поделиться. Это инициализирует и представляет объект UIActivityViewController. В зависимости от того, задаю ли я параметр activityItems либо URL веб-представления, либо соответствующим URL-адресом absoluteString, предлагаются различные действия, но опция Печать никогда не отображается (и не предлагается в разделе «Дополнительно»).

Я знаю, как распечатать содержимое веб-представления явно, используя UIPrintInfo и UIPrintInteractionController, но это будет отдельная кнопка на панели инструментов, тогда как я хочу просто включить системную опцию «Печать» в строку кнопки активности. Я предполагаю, что печать веб-представления не требует явного кодирования.

Что я могу сделать?


person Stefan    schedule 05.12.2017    source источник


Ответы (1)


Вы можете создать пользовательскую активность для UIActivityCotnroller следующим образом:

 import UIKit

protocol CustomActivityDelegate : NSObjectProtocol
{
    func performActionCompletion(actvity: CustomActivity)
}


class CustomActivity: UIActivity {

    var delegate: CustomActivityDelegate?


    override class var activityCategory: UIActivityCategory {
        return .action
    }

    override var activityType: UIActivityType? {
        guard let bundleId = Bundle.main.bundleIdentifier else {return nil}
        return UIActivityType(rawValue: bundleId + "\(self.classForCoder)")
    }

    override var activityTitle: String? {
        return "You title"
    }

    override var activityImage: UIImage? {
        return <Your activity image >
    }

    override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
        return true
    }

    override func prepare(withActivityItems activityItems: [Any]) {
        //
    }

    override func perform() {
        self.delegate?.performActionCompletion(actvity: self)
        activityDidFinish(true)
    }
}

Вы можете инициализировать это действие примерно так

let customActivity = CustomActivity()
customActivity.delegate = self

И вы можете добавить это пользовательское действие при подготовке UIActivityController.

let activityViewController : UIActivityViewController = UIActivityViewController(activityItems: [customActivity], applicationActivities: nil)

и вам также нужно будет реализовать метод обратного вызова

func performActionCompletion(actvity: CustomActivity)
{
   //Perform you task
}

Примечание. Это всего лишь псевдокод, который может содержать ошибки или проблемы с синтаксисом.

person Hitesh Sultaniya    schedule 07.12.2017
comment
Спасибо за вашу подсказку. Это удивительно сложно, я думал, что печать содержимого URL / UIWebView будет более простой в iOS. Тем не менее, я думаю, что я реализую это таким образом. - person Stefan; 08.12.2017
comment
@stefan, если ваша проблема решена, примите мой ответ - person Hitesh Sultaniya; 12.12.2017
comment
Я с радостью это сделаю, если не появится другая идея сделать это более коротким способом — я надеялся на решение без явного кодирования. В очередной раз благодарим за помощь! - person Stefan; 12.12.2017