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, вы можете сделать это, выполнив следующие действия.

  1. Первый подкласс QLPreviewController
  2. Реализуйте функцию "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;
    }
    
  3. Получите панель инструментов и добавьте наблюдателя, чтобы наблюдать за его скрытым свойством.

    - (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"];
    }
    
  4. Реализовать - (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 автоматически скроет нижнюю панель инструментов.

Другие вопросы по тегам