Я искал решение этой проблемы в течение нескольких месяцев и, наконец, нашел способ настроить панель навигации QLPreviewController.Ранее я также использовал UIWebView для отображения документов, поскольку мне не разрешено отображать кнопку iOS-поделиться для определенных конфиденциальных документов в моем приложении, и это то, что делает QLPreviewController.Однако я хотел иметь такие приятные функции, как оглавление с небольшими превью и прочее.Поэтому я искал надежный способ избавиться от этой кнопки.Как и вы, ребята, я впервые начал настраивать панель навигации QLPreviewController.Однако, как уже отмечали другие, это абсолютно невозможно с iOS6.Поэтому вместо того, чтобы настраивать существующую панель навигации, нам нужно создать собственную и поместить ее перед панелью навигации QL, скрывая ее.
Так как это сделать?Прежде всего нам нужно создать подкласс QLPreviewContoller и переписать метод viewDidAppear и viewWillLayoutSubviews следующим образом:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.qlNavigationBar = [self getNavigationBarFromView:self.view];
self.overlayNavigationBar = [[UINavigationBar alloc] initWithFrame:[self navigationBarFrameForOrientation:[[UIApplication sharedApplication] statusBarOrientation]]];
self.overlayNavigationBar.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[self.view addSubview:self.overlayNavigationBar];
NSAssert(self.qlNavigationBar, @"could not find navigation bar");
if (self.qlNavigationBar) {
[self.qlNavigationBar addObserver:self forKeyPath:@"hidden" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:nil];
}
// Now initialize your custom navigation bar with whatever items you like...
UINavigationItem *item = [[UINavigationItem alloc] initWithTitle:@"Your title goes here"];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneButtonTapped:)];
item.leftBarButtonItem = doneButton;
item.hidesBackButton = YES;
[self.overlayNavigationBar pushNavigationItem:item animated:NO];
}
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
self.overlayNavigationBar.frame = [self navigationBarFrameForOrientation:[[UIApplication sharedApplication] statusBarOrientation]];
}
qlNavigationBar - это панель навигации по умолчанию, принадлежащая QLPreviewController * overlayNavigationэто наш пользовательский, который будет скрывать по умолчанию.Мы также добавляем наблюдение значения ключа в панель навигации QL по умолчанию, чтобы получать уведомления, когда панель навигации по умолчанию скрывается / появляется снова.В методе viewWillLayoutSubviews мы позаботимся о нашей пользовательской рамке панели навигации.
Следующее, что нам нужно сделать, это прослушать изменения видимости панели навигации быстрого просмотра:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
// Toggle visiblity of our custom navigation bar according to the ql navigationbar
self.overlayNavigationBar.hidden = self.qlNavigationBar.isHidden;
}
Итак, теперь нам нужно реализовать методы, которые нам нужны, чтобы получить панель навигации QL, и такую, которая всегда дает нам текущий кадр для нашей пользовательской панели навигации:
- (UINavigationBar*)getNavigationBarFromView:(UIView *)view {
// Find the QL Navigationbar
for (UIView *v in view.subviews) {
if ([v isKindOfClass:[UINavigationBar class]]) {
return (UINavigationBar *)v;
} else {
UINavigationBar *navigationBar = [self getNavigationBarFromView:v];
if (navigationBar) {
return navigationBar;
}
}
}
return nil;
}
- (CGRect)navigationBarFrameForOrientation:(UIInterfaceOrientation)orientation {
// We cannot use the frame of qlNavigationBar as it changes position when hidden, also there seems to be a bug in iOS7 concerning qlNavigationBar height in landscape
return CGRectMake(0.0f, self.isIOS6 ? 20.0f : 0.0f, self.view.bounds.size.width, [self navigationBarHeight:orientation]);
}
- (CGFloat)navigationBarHeight:(UIInterfaceOrientation)orientation {
if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
if(UIInterfaceOrientationIsLandscape(orientation)) {
return self.isIOS6 ? 32.0f : 52.0f;
} else {
return self.isIOS6 ? 44.0f : 64.0f;
}
} else {
return self.isIOS6 ? 44.0f : 64.0f;
}
}
Что еще?Конечно, вам нужно определить свойства, удалить наблюдателя в dealloc , а также определить и установить свойство iOS6 (в Интернете множество примеров ...).Также вам нужно настроить панель навигации и прослушать обратные вызовы кнопок.Вот и все.
Я знаю, что это немного глупо ... скрывать / заменять кнопку действия QL по умолчанию, скрывая ее под другой панелью навигации ... но, по крайней мере, она работает надежно для меня, а вы нетдоступ к частным API и т. д.
Я протестировал свое решение на всех доступных симуляторах для iOS 6.0–7.0, а также на iPad 2 и 3, iPhone 4S & 5 (последняя с установленной iOS 7.0 Beta 6).