Скрыть правую кнопку QLPreviewController?
Я создаю подкласс QLPreviewController в моем приложении и использую следующий код.
QLPreviewControllerSubClass* preview = [[QLPreviewControllerSubClass alloc] init];
[self presentViewController:preview
animated:YES
completion:^()
{
// do more stuff here
}];
Я хочу, чтобы скрыть правую кнопку бар. Попробовал
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self navigationItem].rightBarButtonItems = nil;
}
Но это не сокрытие. Любая помощь будет заметна
8 ответов
Его простой и хорошо работающий импорт быстрого просмотра и создания класса QL. Нажмите здесь, чтобы получить результат, который вам всем нужен.
импорт UIKit
импорт QuickLook.
Класс QLSubclass: QLPreviewController, QLPreviewControllerDataSource {
var p = NSURL()
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}
override func viewDidLayoutSubviews() {
navigationItem.rightBarButtonItems?[0] = UIBarButtonItem()
}
func show(controller: UIViewController, url: NSURL) {
// Refreshing the view
p = url
self.dataSource = self
self.reloadData()
// Printing the doc
if let navController = controller.navigationController {
navController.pushViewController(self, animated: true)
}
else {
controller.show(self, sender: nil)
}
}
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
let doc = p
return doc
}
func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
return 1
}
}
после того, как по вашему мнению контроллер класса
Класс PatternVC: UIViewController, UIDocumentInteractionControllerDelegate, UINavigationControllerDelegate {
var link = ""
override func viewDidLoad() {
super.viewDidLoad()
let url = "YOUR_URL_LINK"
//check file exist in local or not------
if isFileExist(imgURL: url) {
//Found then show
let loadPath = loadDataFromDirectory(imgURL: url)
showFileWithPath(path: loadPath)
}else {
//save in local
saveDataOnDocumentDirectory(imgURL: url)
}
}
override func viewDidLayoutSubviews() {
self.navigationController?.setNavigationBarHidden(true, animated: false)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}//Open data
func showFileWithPath(path: String){
let isFileFound:Bool? = FileManager.default.fileExists(atPath: path)
if isFileFound == true{
QLSubclass().show(controller: self, url: URL(fileURLWithPath: path) as NSURL)
}else{}}
Также добавьте функцию для сохранения в локальном в вашем контроллере представления - // запрос загрузки -----
private var downloadTask: URLSessionDownloadTask?
func saveDataOnDocumentDirectory(imgURL: String) {
//let url = URL(string: imgURL)
let escapedAddress = imgURL.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
let url2 = URL(string: escapedAddress!)
let sessionConfig = URLSessionConfiguration.default
//let sessionConfig = URLSessionConfiguration.background(withIdentifier: "backgroundSession")
let session: URLSession! = URLSession(configuration: sessionConfig, delegate: self, delegateQueue: nil)
downloadTask = session.downloadTask(with: url2!)
downloadTask?.resume()
DispatchQueue.main.async {
}
}}
После этого включает в себя расширение для представления расширения PatternVC: URLSessionDelegate, URLSessionDownloadDelegate{
func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
}
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
if error != nil {
// lbl.text = "Download failed"
}
resetView()
}
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
let fileManager = FileManager.default
do {
let requestURL = downloadTask.currentRequest?.url
let documentDirectory = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor:nil, create:true)
let fileURL = documentDirectory.appendingPathComponent(getImageNameFromUrl(imgURL: requestURL!))
do {
try fileManager.moveItem(at: location, to: fileURL)
print("save item: \(fileURL)")
} catch (let writeError) {
print("Error creating a file \(fileURL) : \(writeError)")
}
} catch {
print(error)
}
DispatchQueue.main.async {
//self.loadDirectory()
self.resetView()
}
}
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
// 1
//guard let _ = downloadTask.originalRequest?.url, let download = model?.imagePath else { return }
let progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
DispatchQueue.main.async {
//self.radialView.ringProgress = CGFloat(progress * 100)
}
print("-URL: \(downloadTask.currentRequest?.url?.relativePath ?? "") ----Per: \(CGFloat(progress * 100))")
}
func resetView() {
downloadTask!.cancel()
}
func isFileExist(imgURL: String) -> Bool{
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
let url = NSURL(fileURLWithPath: path)
let escapedAddress = imgURL.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
let url2 = URL(string: escapedAddress!)
if let pathComponent = url.appendingPathComponent(getImageNameFromUrl(imgURL: url2!)) {
let filePath = pathComponent.path
let fileManager = FileManager.default
if fileManager.fileExists(atPath: filePath) {
print("FILE AVAILABLE")
return true
} else {
print("FILE NOT AVAILABLE")
let url = APIConstant.videoJpgUrl + link
//self.loadUrl (urlString:url)
return false
}
} else {
print("FILE PATH NOT AVAILABLE")
return false
}
}
func loadDataFromDirectory(imgURL: String) -> String
{
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
let url = NSURL(fileURLWithPath: path)
let escapedAddress = imgURL.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
let url2 = URL(string: escapedAddress!)
if let pathComponent = url.appendingPathComponent(getImageNameFromUrl(imgURL: url2!)) {
let filePath = pathComponent.path
let fileManager = FileManager.default
if fileManager.fileExists(atPath: filePath) {
print("FILE AVAILABLE")
return filePath
} else {
print("FILE NOT AVAILABLE")
let url = APIConstant.videoJpgUrl + link
self.loadUrl (urlString:url)
return filePath
}
}else
{
return "ERROO"
}
}
func getImageNameFromUrl(imgURL: URL) -> String{
let name = imgURL.lastPathComponent
let result = name.substring(from: name.index(name.startIndex, offsetBy: 5))
return result
}
Я имею дело с той же проблемой.
Я сделал RightBarButton скрытым, но может возникнуть некоторая проблема, когда загрузка pdf длится долго.
Ниже мой процесс.
1. Сделайте подкласс QLPreviewController.
2. Добавьте таймер для повторения установки для rightBarButton значения nil, когда класс init.
_hideRightBarButtonTimmer = [NSTimer scheduledTimerWithTimeInterval:0.01
target:self
selector:@selector(hideRightButton)
userInfo:nil
repeats:YES];
3. Неправильный таймер в viewDidAppear.
[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(cancelTimmer) userInfo:nil repeats:NO];
И я обнаружил, что RightBarButton настроен, пока загрузка файла PDF завершена. Если мы сможем обнаружить событие, решение будет намного проще и яснее.
Надеюсь, это будет полезно.
Перейти на подклассы QLPreviewController
и используйте нижеприведенный код, который хорошо работает только для меня, используя Xcode 8.3
,
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let firstView = self.childViewControllers.first {
for view in firstView.view.subviews {
if view.isKind(of: UIToolbar.self) {
view.removeFromSuperview()
}
}
}
}
Я нашел решение отключить (ане скрыть)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
}
Другой способ добиться этого - создать подкласс UIToolbar и переопределить setItems(_:animated:)
, Вы можете вернуть пустой массив, если хотите удалить все или вернуть только те кнопки, которые хотите сохранить. Вот пример https://github.com/mruvim/PreviewControllerHideBottomButtons
Благодаря Мэтью Костелецкому, мне удалось скрыть кнопку "Поделиться", но я хотел бы добавить некоторые детали для тех, кому это нужно, в универсальных приложениях с несколькими файлами.
Во-первых, ответ Мэтью работает, если вы используете QLPreviewController модально. Если вы нажмете QLPreviewController из вашего контроллера навигации, как это;
navigationController?.pushViewController(quickLookController, animated: true)
Он не сможет найти ни NavigationBar, ни ToolBar. Вы должны вызвать QLPreviewController модально, как это;
presentViewController(quickLookController, animated: true, completion: nil)
Также, если вы разрабатываете универсальное приложение и у вас есть список файлов для воспроизведения. Будет еще одна кнопка (кнопка списка);
В iPhone, если у вас есть несколько файлов, QLPreviewController создаст панель инструментов для отображения "Кнопка списка" и "Кнопка общего доступа", и оба они будут на панели инструментов.
В iPad обе эти кнопки находятся на навигационной панели и панели инструментов нет.
Так что в дополнение к ответу Мэтью вы должны искать панель инструментов, если у вас есть несколько файлов в iphone;
func inspectSubviewForView(view: UIView) {
for subview in view.subviews {
if subview is UINavigationBar {
// ** Found a Nav bar, check for navigation items. ** //
let bar = subview as! UINavigationBar
if bar.items?.count > 0 {
if let navItem = bar.items?[0] {
navItem.setRightBarButtonItem(nil, animated: false)
}
}
}
if subview is UIToolbar {
// ** Found a Tool bar, check for ToolBar items. ** //
let bar = subview as! UIToolbar
if bar.items?.count > 0 {
if let toolBarItem = bar.items?[0] {
toolBarItem.enabled = false
}
}
}
if subview.subviews.count > 0 {
// ** this subview has more subviews! Inspect them! ** //
inspectSubviewForView(subview)
}
}
}
Этот фрагмент кода скрывает кнопку "Поделиться" на iPad и отключает кнопку "Поделиться" на iPhone.
Надеюсь, это поможет тем, кто еще нуждается в этом.
Простое решение для этого - добавить один фиктивный вид в текущий viewController и добавить QLPreviewControlle.view
к дурацкому взгляду.
previewController = [[QLPreviewController alloc] init];
previewController.dataSource = self;
previewController.delegate = self;
previewController.currentPreviewItemIndex = 0;
[self.ContentView addSubview:previewController.view];
- (IBAction)removeQPView:(id)sender {
[previewController.view removeFromSuperview];
}
Протестировано на iOS 9 с swift.
Недавно пришлось решить эту проблему и не мог найти способ скрыть эту чертову кнопку. Мне, наконец, удалось скрыть правую кнопку "Поделиться", используя ответ из этого сообщения stackru.
По сути, вы хотите создать подкласс QLPreviewController и вызвать функцию inspectSubviewForView() в вашей функции viewWillAppear(). Найдя элемент навигации, содержащий кнопку "Поделиться", вы можете удалить его:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
// ** traverse subviews until we find the share button ** //
inspectSubviewForView(self.view)
}
func inspectSubviewForView(view: UIView) {
for subview in view.subviews {
if subview is UINavigationBar {
// ** Found a Nav bar, check for navigation items. ** //
let bar = subview as! UINavigationBar
if bar.items?.count > 0 {
if let navItem = bar.items?[0] {
// ** Found the share button, hide it! ** //
hideRightBarItem(navItem)
}
}
}
if subview.subviews.count > 0 {
// ** this subview has more subviews! Inspect them! ** //
inspectSubviewForView(subview)
}
}
}
func hideRightBarItem(navigationItem: UINavigationItem) {
// ** Hide/Remove the Share button ** //
navigationItem.setRightBarButtonItem(nil, animated: false)
}
Предыдущий постер по вышеуказанной ссылке предупредил, что это может не пройти через процесс проверки Apple, так как вы получаете доступ к частным API, так что используйте на свой страх и риск! Также, если Apple обновит QLPreviewController в более поздних версиях iOS, этот код может больше не работать.
Тем не менее, это единственное решение, которое сработало для меня. Я надеюсь, что это работает и для вас!