【问题标题】:Reading touch events in a QLPreviewController在 QLPreviewController 中读取触摸事件
【发布时间】:2012-07-05 08:43:48
【问题描述】:

我有一个 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:] 的调用 手势识别器未激活。

【问题讨论】:

    标签: objective-c ios events uigesturerecognizer quicklook


    【解决方案1】:

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

    我从未使用过该课程,因此我可能会在左侧领域出路。

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

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

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

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

    希望对你有所帮助。

    【讨论】:

    • 嗨,约翰,感谢您的建议。我已经更新了我的原始帖子以展示我如何实例化它。关于是否在父控制器中的事件;我在下面有另一个 UIImageView 和工作事件侦听器,它们也没有接收到任何东西。
    • 您的 TouchPreviewController 可能有问题 - 它有一个 init 方法 init:(CGRect)aRect - 但您正在调用 init。我认为没有调用您的 init 方法。我会将其更改为 initWithFrame 并调用 [super initWithFrame:aRect] 只是为了使事情与构造视图的“正常”方式保持一致。
    • 你是对的! - 我没有注意争论;只注意到它被称为 init。
    猜你喜欢
    • 1970-01-01
    • 2011-01-07
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多