Ios 如何使用swift在QLPreviewController中隐藏共享按钮?
我正在使用下面的代码使用QLPreviewcontroller在我的应用程序中显示一些文档Ios 如何使用swift在QLPreviewController中隐藏共享按钮?,ios,swift,qlpreviewcontroller,rightbarbuttonitem,Ios,Swift,Qlpreviewcontroller,Rightbarbuttonitem,我正在使用下面的代码使用QLPreviewcontroller在我的应用程序中显示一些文档 let ql = QLPreviewController() ql.dataSource = self //ql.navigationItem.rightBarButtonItems = nil ql.navigationItem.rightBarButtonItem = nil presentViewController(ql, animated: true, completion: nil) 我不希
let ql = QLPreviewController()
ql.dataSource = self
//ql.navigationItem.rightBarButtonItems = nil
ql.navigationItem.rightBarButtonItem = nil
presentViewController(ql, animated: true, completion: nil)
我不希望共享按钮位于QLViewController的右上方。我曾尝试将rightbarbuttonim
设置为零,但不起作用
我怎么能隐瞒呢?我知道这是一个老问题,但我花了这么多时间寻找解决方案,并想出了一些可行的办法 所以,对于任何一个想和我一样的人来说。这是我的解决办法 代码在objective-c中,但它只是简单地转换成Swift 首先,我们创建QLPreviewController的子类,并在子类中重写以下方法 编辑 斯威夫特:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.rightBarButtonItem = nil
//For ipads the share button becomes a rightBarButtonItem
self.navigationController?.toolbar?.isHidden = true
//This hides the share item
self.navigationController?.toolbar?.addObserver(self, forKeyPath: "hidden", options: NSKeyValueObservingOptionPrior, context: nil)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.navigationController?.toolbar?.removeObserver(self, forKeyPath: "hidden")
}
override func observeValue(forKeyPath keyPath: String, ofObject object: Any, change: [AnyHashable: Any], context: UnsafeMutableRawPointer) {
var isToolBarHidden: Bool? = self.navigationController?.toolbar?.isHidden
// If the ToolBar is not hidden
if isToolBarHidden == nil {
DispatchQueue.main.async(execute: {() -> Void in
self.navigationController?.toolbar?.isHidden = true
})
}
}
self.navigationController?.pushViewController(qlPreviewController, animated: true)
目标C:
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.navigationItem.rightBarButtonItem = nil; //For ipads the share button becomes a rightBarButtonItem
[[self.navigationController toolbar] setHidden:YES]; //This hides the share item
[[self.navigationController toolbar] addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionPrior context:nil];
}
移除ViewWill上的观察者将消失
-(void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[self.navigationController toolbar] removeObserver:self forKeyPath:@"hidden"];
}
观察者方法:必需,因为当您单击图像以隐藏导航栏和工具栏时,单击时共享按钮将再次可见
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
BOOL isToolBarHidden = [self.navigationController toolbar].hidden;
// If the ToolBar is not hidden
if (!isToolBarHidden) {
dispatch_async(dispatch_get_main_queue(), ^{
[[self.navigationController toolbar] setHidden:YES];
});
}
}
并且必须从现有的navigationController中推送PreviewController
[self.navigationController pushViewController:qlPreviewController animated:YES];
而且我们还必须使用子类而不是QLEVIEWCONTROLLER。在iOS 10的Swift 3中,这些解决方案都不适用于我。问题是共享按钮是在ViewDidDisplay方法之后创建的 以下是我删除共享按钮的步骤: 1) 子类化我的QLPreviewController
[self.navigationController pushViewController:qlPreviewController animated:YES];
2) 创建了在此子类中打开我的文档的方法:
func show(controller: UIViewController, url: NSURL) {
// Refreshing the view
self.reloadData()
// Printing the doc
if let navController = controller.navigationController {
navController.pushViewController(self, animated: true)
}
else {
controller.show(self, sender: nil)
}
}
3) 在我的ViewDidLayoutSubView中,我创建了一个虚拟按钮项来替换共享按钮:
override func viewDidLayoutSubviews() {
navigationItem.rightBarButtonItems?[0] = UIBarButtonItem()
}
4) 当我想在另一个VC中打开一个文档时,我这样称呼它:
QLSubclass().show(controller: self, url: path as NSURL)
注意:总是这样调用它,而不是使用您实例化的全局变量,因为在它消失之前,您总是会看到share按钮。这对我很有用
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
let add = self.childViewControllers.first as! UINavigationController
let layoutContainerView = add.view.subviews[1] as! UINavigationBar
layoutContainerView.subviews[2].subviews[1].isHidden = true
}
}
如果仍然有人想要删除共享选项或想要自定义
qlviewcontroller
的导航栏,那么他们可以尝试创建UIViewController
并根据需要自定义它,然后创建qlviewcontroller
对象并将其添加为子视图控制器
这将使你摆脱共享按钮,你自定义导航栏颜色等。这是我的工作
要了解如何添加子视图控制器,请参考
qlviewcontroller
var toolbars: [UIView] = []
var observations : [NSKeyValueObservation] = []
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.setRightBarButton(UIBarButtonItem(), animated: false)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.toolbar.isHidden = true
if let navigationToobar = navigationController?.toolbar {
let observation = navigationToobar.observe(\.isHidden) {[weak self] (changedToolBar, change) in
if self?.navigationController?.toolbar.isHidden == false {
self?.navigationController?.toolbar.isHidden = true
}
}
observations.append(observation)
}
toolbars = toolbarsInSubviews(forView: view)
for toolbar in toolbars {
toolbar.isHidden = true
let observation = toolbar.observe(\.isHidden) { (changedToolBar, change) in
if let isHidden = change.newValue,
isHidden == false {
changedToolBar.isHidden = true
}
}
observations.append(observation)
}
}
private func toolbarsInSubviews(forView view: UIView) -> [UIView] {
var toolbars: [UIView] = []
for subview in view.subviews {
if subview is UIToolbar {
toolbars.append(subview)
}
toolbars.append(contentsOf: toolbarsInSubviews(forView: subview))
}
return toolbars
}
Swift 5解决方案:
var toolbars: [UIView] = []
var observations : [NSKeyValueObservation] = []
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.setRightBarButton(UIBarButtonItem(), animated: false)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.toolbar.isHidden = true
if let navigationToobar = navigationController?.toolbar {
let observation = navigationToobar.observe(\.isHidden) {[weak self] (changedToolBar, change) in
if self?.navigationController?.toolbar.isHidden == false {
self?.navigationController?.toolbar.isHidden = true
}
}
observations.append(observation)
}
toolbars = toolbarsInSubviews(forView: view)
for toolbar in toolbars {
toolbar.isHidden = true
let observation = toolbar.observe(\.isHidden) { (changedToolBar, change) in
if let isHidden = change.newValue,
isHidden == false {
changedToolBar.isHidden = true
}
}
observations.append(observation)
}
}
private func toolbarsInSubviews(forView view: UIView) -> [UIView] {
var toolbars: [UIView] = []
for subview in view.subviews {
if subview is UIToolbar {
toolbars.append(subview)
}
toolbars.append(contentsOf: toolbarsInSubviews(forView: subview))
}
return toolbars
}
子类QLPreviewController:
final class CustomQLPreviewController: QLPreviewController {
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
(children[0] as? UINavigationController)?.setToolbarHidden(true, animated: false)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
(children[0] as? UINavigationController)?.setToolbarHidden(true, animated: false)
}
}
然后在您想要的地方呈现此子类,如下所示:
let previewController = QLVideoController()
present(controller, animated: true, completion: nil)
- 使用此方法,您可以使用“共享”按钮片刻
RightBarButtonim
分配给UIBarButtonim
的新实例(无需任何进一步配置)这是一个很好的答案!不起作用。如果您应用此代码,QLVeviewController将在底部显示一个工具栏,与您刚从导航栏右上角删除的共享按钮相同。6s、iOS 13.5、子项[0]
将崩溃,因此我将其更改为子项。首先
,但它似乎没有执行代码,并且工具栏显示不起作用,共享按钮仍然可见&如果您希望iOS13隐藏rightBarButtonItem,则需要在“override func viewDidLoad()”覆盖func viewWillLayoutSubviews(){super.viewWillLayoutSubviews()中添加此navigationItem.rightBarButtonItem=UIBarButtonItem()
navigationController?.toolbar.isHidden=true navigationItem.rightBarButtonItem=nil}欢迎来到SO,感谢您的贡献!如果您在代码片段周围提供一些额外的上下文来解释它们的作用和/或它们如何回答问题,这通常会很有帮助。源代码或引用的链接也有助于那些试图使代码适应稍微不同的情况的人。这个答案是无效的。