QLPreviewController's view
Я просто пытаюсь добраться до QLPreviewController.view. В самом деле, я хочу поймать событие касания в его представлении, чтобы показать / скрыть панель инструментов и т.д. Я пытаюсь:
QLPreviewController* qlpc = [QLPreviewController new];
qlpc.delegate = self;
qlpc.dataSource = self;
qlpc.currentPreviewItemIndex=qlIndex;
[navigator pushViewController:qlpc animated:YES];
qlpc.title = [path lastPathComponent];
[qlpc setToolbarItems:[NSArray arrayWithObjects:self.dirBrowserButton,self.space, self.editButton, self.btnSend, nil] animated:YES];
UITapGestureRecognizer* gestTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showControls:)];
gestTap.cancelsTouchesInView=NO;
[qlpc.view addGestureRecognizer:[gestTap autorelease]];
[qlpc release];
И ничего не происходит
Если я присоединяю UITapRecognizer к navigationController.view, он срабатывает только при касании панели инструментов / панели навигации. UISwipeGestureRecognizer отлично работает в этом случае.
Я попытался прикрепить прозрачный вид наложения и добавить распознаватели жестов, но безуспешно. Ну, я видел несколько приложений, которые реализуют такую функцию, так что, очевидно, это возможно, но как? Извините, я гуглил весь день и не нашел решения. Пожалуйста, помогите мне.
6 ответов
Я не нашел ни одного из ответов здесь, чтобы работать, но тот, который сделал для меня, был подкласс QLPreviewController и переопределить viewDidAppear следующим образом:
- (void)viewDidAppear:(BOOL)animated
{
UITapGestureRecognizer *gestTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showControls:)];
gestTap.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:[gestTap autorelease]];
}
Я работал над этой проблемой сегодня, и предложение переопределить -(void)contentWasTappedInPreviewContentController:(id)item {} близко, но когда вы возитесь с обработкой контроллеров предварительного просмотра.
Поэтому я перестал переопределять этот метод и вместо этого создал сигнал RAC, который срабатывает при каждом вызове метода. Это не мешает поведению по умолчанию QL. Я делаю это в подклассе QLPreviewController, но это не должно быть необходимым.
У меня есть недвижимость в моем классе:
@property RACSignal *contentTapped;
Затем в моем методе init моего подкласса QLPreviewController:
_contentTapped = [self rac_signalForSelector:@selector(contentWasTappedInPreviewContentController:)];
Теперь в другом классе или даже внутри вы можете использовать сигнал следующим образом:
previewController.contentTapped subscribeNext:^(id x) {
// Put your handler here!
}];
С вашим решением, вид QPLreviewController все еще получает штрихи? Я пытался сделать что-то подобное (я краду представление из QLPreviewController, чтобы использовать его), и похоже, что мое представление наложения не пропускает ничего через представление, лежащее за ним.
Вот мое решение (использовать KVO), где я отслеживаю состояние панели навигации и показываю панель инструментов при необходимости (кажется, что при прикосновении она скрывает панель инструментов самостоятельно)
#define kNavigationBarKeyPath @"navigationBar.hidden"
static void * const NavigationBarKVOContext = (void*)&NavigationBarKVOContext;
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.navigationController setToolbarHidden:NO];
[self.navigationController addObserver:self forKeyPath:kNavigationBarKeyPath options:NSKeyValueObservingOptionPrior context:NavigationBarKVOContext];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[self.navigationController removeObserver:self forKeyPath:kNavigationBarKeyPath];
}
А также
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ( context == NavigationBarKVOContext ) {
BOOL prior = [change[NSKeyValueChangeNotificationIsPriorKey] boolValue];
if ( prior && self.navigationController.toolbarHidden ) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.navigationController setToolbarHidden:NO animated:YES];
});
}
}
}
Хорошо, решение очень простое. только что добавил вид наложения на keyWindow. Прикрепленные распознаватели жестов наложены, и это работает.
QLPreviewController* qlpc = [QLPreviewController new];
qlpc.delegate = self;
qlpc.dataSource = self;
qlpc.currentPreviewItemIndex=qlIndex;
[navigator pushViewController:qlpc animated:YES];
qlpc.title = [path lastPathComponent];
UIView* overlay = [[[UIView alloc] initWithFrame:navigator.view.bounds] autorelease];
[[[UIApplication sharedApplication] keyWindow] addSubview:overlay];
[overlay setNeedsDisplay];
[qlpc setToolbarItems:[NSArray arrayWithObjects:self.dirBrowserButton,self.space, self.editButton, self.btnSend, nil] animated:YES];
UITapGestureRecognizer* gestTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showControls:)];
gestTap.cancelsTouchesInView=NO;
[overlay addGestureRecognizer:[gestTap autorelease]];
[qlpc release];
Подкласс QLPreviewController и затем переопределить
-(void)contentWasTappedInPreviewContentController:(id)item {}
Это оно!