我QLPreviewController
在我的应用程序中使用并希望隐藏允许在其数据源项中移动的底部工具栏。有可能以某种方式做吗?
我试图将其作为subview
of进行搜索,QLPreviewController's view
但它只有一个_UISizeTrackingView
class 的子视图。据我了解,这是一个私人课程,所以我无权在那里寻找东西。
有什么方法可以隐藏此工具栏,Apple 是否允许这样做?谢谢你。
我QLPreviewController
在我的应用程序中使用并希望隐藏允许在其数据源项中移动的底部工具栏。有可能以某种方式做吗?
我试图将其作为subview
of进行搜索,QLPreviewController's view
但它只有一个_UISizeTrackingView
class 的子视图。据我了解,这是一个私人课程,所以我无权在那里寻找东西。
有什么方法可以隐藏此工具栏,Apple 是否允许这样做?谢谢你。
QLPreviewViewController
里面可以有多个工具栏。这就是为什么你需要UIToolbar
在子视图中找到所有并隐藏它们。
您还需要观察hidden
属性的变化,因为当用户点击QLPreviewViewController
它时,它会改变工具栏和导航栏的可见性。
斯威夫特 3:
var toolbars: [UIToolbar] = []
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
toolbars = findToolbarsInSubviews(forView: view)
for toolbar in toolbars {
toolbar.isHidden = true
toolbar.addObserver(self, forKeyPath: "hidden", options: .new, context: nil)
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
for toolbar in toolbars {
toolbar.removeObserver(self, forKeyPath: "hidden")
}
}
private func findToolbarsInSubviews(forView view: UIView) -> [UIToolbar] {
var toolbars: [UIToolbar] = []
for subview in view.subviews {
if subview is UIToolbar {
toolbars.append(subview as! UIToolbar)
}
toolbars.append(contentsOf: findToolbarsInSubviews(forView: subview))
}
return toolbars
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if let keyPath = keyPath,
let toolbar = object as? UIToolbar,
let value = change?[.newKey] as? Bool,
keyPath == "hidden" && value == false {
toolbar.isHidden = true
}
}
找了很多答案,终于找到了解决办法。如果你想一直隐藏底部工具栏,你可以按照下面的步骤来做。
实现“getToolBarFromView”函数获取QLPreviewController的toolBar
- (UIToolbar *)getToolBarFromView:(UIView *)view {
// Find the QL ToolBar
for (UIView *v in view.subviews) {
if ([v isKindOfClass:[UIToolbar class]]) {
return (UIToolbar *)v;
} else {
UIToolbar *toolBar = [self getToolBarFromView:v];
if (toolBar) {
return toolBar;
}
}
}
return nil;
}
获取工具栏并添加一个观察者来观察它的“隐藏”属性。
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
// Get the ToolBar
self.qlToolBar = [self getToolBarFromView:self.view];
self.qlToolBar.hidden = true;
if (self.qlToolBar) {
[self.qlToolBar addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionPrior context:nil];
}
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[self.navigationController removeObserver:self forKeyPath:@"hidden"];
}
实现 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
BOOL isToolBarHidden = self.qlToolBar.hidden;
// If the ToolBar is not hidden
if (!isToolBarHidden) {
dispatch_async(dispatch_get_main_queue(), ^{
self.qlToolBar.hidden = true;
});
}
}
你应该做的最后一件事是从你自己的 navigationController 中展示这个控制器。希望它对你有用!
public override void ViewDidLayoutSubviews()
{
this.NavigationController.Toolbar.Hidden = true;
}
这肯定会奏效
1.QLPreviewController的第一个子类
2.编码
(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController.view.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isKindOfClass:[UIToolbar class]]) {
obj.hidden = YES;
}
}];
[self.view.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isKindOfClass:[UIToolbar class]]) {
obj.hidden = YES;
}
}];
}
有一个更简单的解决方案,您必须更改 QLPreviewControllerDataSource 方法。
func numberOfPreviewItemsInPreviewController(controller: QLPreviewController) -> Int {
return 1
}
将预览项目的数量设置为 1 将自动隐藏底部工具栏。