QLPreviewController's view - PullRequest
       7

QLPreviewController's view

3 голосов
/ 23 мая 2011

Я просто пытаюсь добраться до 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 ]

1 голос
/ 23 июня 2014

Вот мое решение (использовать 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];
            });
        }
    }
}
1 голос
/ 06 марта 2014

Я работал над этой проблемой сегодня, и предложение переопределить - (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!
}];
1 голос
/ 14 сентября 2011

С вашим решением видение QLPreviewController все еще получает прикосновения? Я пытался сделать что-то подобное (я краду представление из QLPreviewController, чтобы использовать его), и похоже, что мое представление наложения не пропускает ничего через представление, лежащее за ним.

0 голосов
/ 06 февраля 2014

Подкласс QLPreviewController, а затем переопределить

- (void) contentWasTappedInPreviewContentController: (id) item {}

Это его!

0 голосов
/ 23 ноября 2011

Я не нашел ни одного из ответов здесь, чтобы работать, но тот, который сделал для меня, заключался в том, чтобы создать подкласс QLPreviewController и переопределить viewDidAppear следующим образом:

- (void)viewDidAppear:(BOOL)animated
{ 
    UITapGestureRecognizer *gestTap  = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showControls:)];
    gestTap.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:[gestTap autorelease]];
}
0 голосов
/ 27 мая 2011

Хорошо, решение очень простое.только что добавил вид наложения на 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];
...