我有一个 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 层次结构。
我认为您可能不必通过从 nib 文件实例化 viewController 来继承 QLPreviewController。
当您的父 viewController 的 UITapGestureRecognizer 收到一个事件时,您可以将 QLPreviewController 推送到导航堆栈上,或者在完成后将其从导航堆栈中弹出。
希望对您有所帮助。
关于objective-c - 在 QLPreviewController 中读取触摸事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11340748/