QLPreviewController скрыть нижнюю панель инструментов
Я использую QLPreviewController
в моем приложении и хочу скрыть нижнюю панель инструментов, которая позволяет перемещаться по элементам источника данных. Можно ли как-то это сделать?
Я пытался найти его как subview
из QLPreviewController's view
но у него есть только одно подпредставление _UISizeTrackingView
учебный класс. Как я понимаю, это частный класс, поэтому я не имею права что-то там искать.
Есть ли способы скрыть эту панель инструментов и позволяет ли Apple сделать это? Спасибо.
5 ответов
QLPreviewViewController
может иметь более 1 панели инструментов внутри. Вот почему вам нужно найти все 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
}
}
После поиска множества ответов, наконец, я нашел решение. Если вы хотите постоянно скрывать bottomToolBar, вы можете сделать это, выполнив следующие действия.
- Первый подкласс QLPreviewController
Реализуйте функцию "getToolBarFromView", чтобы получить панель инструментов QLPreviewController
- (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) Наблюдать за ValueForKeyPath:(NSString *)keyPath ofObject:(id) изменение объекта:(NSDictionary *) изменить контекст:(void *) метод контекста
- (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; }); } }
И последнее, что вы должны сделать, это представить этот контроллер из вашего собственного навигационного контроллера. Надеюсь, он работает для вас!
1. Первый подкласс QLPreviewController
2.coding
(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;
}
}];
}
public override void ViewDidLayoutSubviews()
{
this.NavigationController.Toolbar.Hidden = true;
}
это будет работать наверняка
Есть более простое решение, вы должны изменить метод QLPreviewControllerDataSource.
func numberOfPreviewItemsInPreviewController(controller: QLPreviewController) -> Int {
return 1
}
Установка количества предварительно просмотренных элементов в 1 автоматически скроет нижнюю панель инструментов.