2

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

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

/------------------------ [ 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

编辑:为澄清起见,这就是我实例化控制器的方式:

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:我注意到一件事。如果我尝试做出滑动手势,我会收到以下消息。这可以阐明什么是错误/缺失的?

由于手势识别器未激活,因此忽略对 [UIPanGestureRecognizer setTranslation:inView:] 的调用。

4

1 回答 1

1

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

我从来没有使用过这门课,所以我可以在左外野出路。

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

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

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

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

希望这个对你有帮助。

于 2012-07-10T03:39:37.610 回答