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 {}

Это оно!

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