objective-c - 在 QLPreviewController 中读取触摸事件

标签 objective-c ios events uigesturerecognizer quicklook

我有一个 QuickLook View ,我可以在其中查看我的应用程序的一些文档。它工作正常,但我在再次关闭 View 时遇到了麻烦。如何创建一个触摸事件/手势识别器,以便我可以检测到用户何时想要关闭 View ?

我尝试了以下方法,但在我测试时似乎没有触发任何事件。

/------------------------ [ TouchPreviewController.h ]---------------------------
#import <Quicklook/Quicklook.h>

@interface TouchPreviewController : QLPreviewController

@end

//------------------------ [ TouchPreviewController.m ]---------------------------
#import "TouchPreviewController.h"

@implementation TouchPreviewController

- (id)init:(CGRect)aRect {
    if (self = [super init]) {
        // We set it here directly for convenience
        // As by default for a UIImageView it is set to NO
        UITapGestureRecognizer *singleFingerDTap = [[UITapGestureRecognizer alloc]
                                                initWithTarget:self action:@selector(handleSingleDoubleTap:)];
        singleFingerDTap.numberOfTapsRequired = 2;
        [self.view addGestureRecognizer:singleFingerDTap];
        [self.view setUserInteractionEnabled:YES];
        [self.view setMultipleTouchEnabled:YES];
        //[singleFingerDTap release];
    }
    return self;
}

- (IBAction)handleSingleDoubleTap:(UIGestureRecognizer *) sender {
    CGPoint tapPoint = [sender locationInView:sender.view.superview];
    [UIView beginAnimations:nil context:NULL];
    sender.view.center = tapPoint;
    [UIView commitAnimations];

    NSLog(@"TouchPreviewController tap!" ) ;
}

// I also tried adding this
- (BOOL)gestureRecognizer:(UIGestureRecognizer *) gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*) otherGestureRecognizer {
    return YES;
}

@end

编辑:为了澄清,这是我实例化 Controller 的方式:

documents = [[NSArray alloc] initWithObjects: filename , nil ] ;

preview = [[TouchPreviewController alloc] init];
preview.dataSource = self;
preview.delegate = self;

//set the frame from the parent view
CGFloat w= backgroundViewHolder.frame.size.width; 
CGFloat h= backgroundViewHolder.frame.size.height;
preview.view.frame = CGRectMake(0, 0,w, h);

//refresh the preview controller
[preview reloadData];
[[preview view] setNeedsLayout];
[[preview view] setNeedsDisplay];
[preview refreshCurrentPreviewItem];

//add it  
[quickLookView addSubview:preview.view];

另外,我定义回调方法是这样的:

- (NSInteger) numberOfPreviewItemsInPreviewController: (QLPreviewController *) controller
{
    return [documents count];
}

- (id <QLPreviewItem>) previewController: (QLPreviewController *) controller previewItemAtIndex: (NSInteger) index
{
    return [NSURL fileURLWithPath:[documents objectAtIndex:index]];
}

Edit2:我注意到一件事。如果我尝试做滑动手势,我会收到以下消息。这可以阐明什么是错误/遗漏的?

Ignoring call to [UIPanGestureRecognizer setTranslation:inView:] since gesture recognizer is not active.

最佳答案

我认为您的示例代码不完整。目前尚不清楚您是如何实例化 TouchPreviewController( Storyboard、nib 文件或 loadView。)

我从来没有用过这个类,所以我可能会在左外野出路。

如果您已经在父 viewController 中实例化了一个 UITapGestureRecognizer,它会吸收点击事件并且它们不会传递给您的 TouchPreviewController。

我会通过将 UITapGestureRecognizer 附加到父 viewController 并在那里处理 QLPreviewController 的呈现和卸载来以不同方式实现 View 层次结构。

我认为您可能不必通过从 ni​​b 文件实例化 viewController 来继承 QLPreviewController。

当您的父 viewController 的 UITapGestureRecognizer 收到一个事件时,您可以将 QLPreviewController 推送到导航堆栈上,或者在完成后将其从导航堆栈中弹出。

希望对您有所帮助。

关于objective-c - 在 QLPreviewController 中读取触摸事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11340748/

相关文章:

ios - 无法将 Firebase 导入 Swift 类

iOS - 如何在滚动 UITableView 时减少 UINavigationBar titleView 的 alpha?

javascript - 如何将 onfocus 事件监听器添加到输入字段以更改标签的样式

mysql - 有没有办法提高 mysql 事件执行的性能?

javascript - slider 每次滑动不超过一次迭代 (JavaScript)

iphone - Objective-C 中的公共(public)范围?

iphone - 在 Xcode 中项目构建的链接阶段出现重复符号问题

objective-c - 从Blender导出模型以在iOS App中使用

ios - 如何仅比较文本中选定的字符串与 objective-c 中的给定输入

ios - 用委托(delegate)传递数据但仍然没有为什么?