Как отключить кнопку печати QLPreviewController - PullRequest
9 голосов
/ 03 августа 2011

Может кто-нибудь подсказать, как убрать кнопку печати QLPreviewController? Также хотел бы отключить вырезать / вставить / копировать.

Ответы [ 8 ]

6 голосов
/ 03 августа 2011

UPDATE:

Это больше не работает в iOS 6. Quick Look запускается в другом процессе с использованием XPC. Смотрите [здесь] [3] для более подробной информации. Я не предполагаю никакого способа настройки QLPreviewController. Следующий ответ остается для всех, кто интересуется предварительной версией iOS 6.


Если вы хотите просто удалить кнопку действия, вам нужно создать подкласс QLPreviewController. Затем в -viewWillAppear: вам нужно удалить кнопку действия, позвонив по номеру [[self navigationItem] setRightBarButtonItem:nil];. Это также удалит возможность обмениваться файлами с другими приложениями. Если вы согласны с этой потерей, тогда это самое простое решение. Следует помнить, что QLPreviewController НЕ предназначен для настройки. Вы можете проверить это хранилище на Github. Он содержит QLPreviewController, который уже безопасно разделен на подклассы. Вам просто нужно добавить одну строку, чтобы удалить кнопку действия. Репо также имеет ряд других удобств.

Лучшее, но более сложное решение - использовать UIDocumentInteractionController. Насколько я понимаю, QLPreviewController состоит в том, что он построен с использованием UIDocumentInteractionController. QLPreviewController был сделан для общего использования и легкого добавления. UIDocumentInteractionController дает гораздо больше контроля, но его сложнее использовать. Я не могу достаточно описать, как использовать это здесь. Я рекомендую проверить сеанс WWDC 2010 106 Общие сведения о контроллере взаимодействия документов.

Что касается отключения вырезки / копирования / вставки, вы не можете сделать это с помощью QLPreviewController. Вы могли бы сделать это с UIDocumentInteractionController, но я бы на это не рассчитывал. В зависимости от того, какие файлы вы хотите отобразить, вы можете выполнить полностью настраиваемую реализацию, но это большая работа. Это относительно легко сделать зрителей для простого текста, фотографий, видео и PDF. Офисные документы требуют больше усилий, чем они того стоят.

EDIT:

Я встроил возможность убрать кнопку действия прямо в RBFilePreviewer, чтобы вам не пришлось беспокоиться о том, чтобы сделать это самостоятельно.

2 голосов
/ 06 июня 2012
-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    [self navigationItem].rightBarButtonItems = nil;
}

У меня работает вместо [[self navigationItem] setRightBarButtonItem:nil];

2 голосов
/ 15 октября 2011

Если вы подкласс QLPreviewController, а затем добавить этот один метод:

-(void)viewDidAppear:(BOOL)animated{

    [[self navigationItem] setRightBarButtonItem:nil]; 
}

в подклассе, кнопка действия исчезнет, ​​как заметки выше. Это не будет работать, если вы используете viewWillAppear. Кроме того, неожиданным побочным эффектом этого является то, что панель инструментов в окне предварительного просмотра теперь отображается постоянно, а не только при нажатии на вид.

1 голос
/ 13 октября 2013

Мне также нужно настроить элемент navigaiton QLPreviewController. Как и сказано rbrown , XPC используется, и мы больше не можем добавлять пользовательские элементы в viewDidLoad или viewWillAppear.

В настоящее время я использую этот способ:

  1. создать новый класс UIViewController
  2. добавить представление QLPreviewController в новый класс

Кажется, проводной, но работает.

0 голосов
/ 02 апреля 2019

Этот подкласс работает с Swift 4.2 и iOS 12 . Он использует трюк, чтобы убедиться, что значок общего ресурса скрыт, не мигая в глазах пользователя.

import QuickLook
import UIKit

class PreviewController: QLPreviewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        guard let layoutContainerView = self.children.first?.view.subviews[1] as? UINavigationBar else { return }
        layoutContainerView.isHidden = true
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)
        guard let layoutContainerView = self.children.first?.view.subviews[1] as? UINavigationBar else { return }
        layoutContainerView.subviews[2].subviews[1].isHidden = true
        layoutContainerView.isHidden = false
    }
}
0 голосов
/ 27 сентября 2018

это работа для меня. Вы должны отладить дочерний контроллер навигации

class QLSPreviewController : QLPreviewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true )
        //This hides the share item
        if let add =  self.childViewControllers.first as? UINavigationController {
            if let layoutContainerView  = add.view.subviews[1] as? UINavigationBar {
                 layoutContainerView.subviews[2].subviews[1].isHidden = true
            }
        }
    }
}
0 голосов
/ 22 января 2016

Я нашел решение для отключения rightBarButtonItem в QLPreviewController, которое отлично работает для меня в iOS8 и iOS9

Вам просто нужно создать подкласс QLPreviewController и переопределить следующие методы, затем используйтеподкласс вместо оригинала QLPreviewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // When coming back from background we make sure the share button on the rightbBarButtonItem is disabled
    __weak typeof(self) weakSelf = self;
    [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
        weakSelf.navigationItem.rightBarButtonItem.enabled = NO;
    }];
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    self.navigationItem.rightBarButtonItem.enabled = NO; // Disable the share button
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    self.navigationItem.rightBarButtonItem.enabled = NO; // Disable the share button
}
0 голосов
/ 17 ноября 2014

Я решаю эту проблему следующим образом:

UIView *viewPreviewController; //from storyboard

QLPreviewController *previewController = [[QLPreviewController alloc] init];
previewController.delegate = self;
previewController.dataSource = self;
previewController.currentPreviewItemIndex = 0;
[previewController.view setFrame:CGRectMake(0,0, self.viewPreviewController.frame.size.width, self.viewPreviewController.frame.size.height)];
[previewController.navigationController setHidesBarsOnTap:YES];
previewController.navigationItem.rightBarButtonItems = nil;

[self.viewPreviewController addSubview:previewController.view];

Если бы я не включил PreviewController в UIView, он бы не работал!

...