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:私が気づいたことの1つ。スワイプ ジェスチャを実行しようとすると、次のメッセージが表示されます。これは、何が間違っている/欠けているかを明らかにする可能性がありますか?

ジェスチャ認識機能がアクティブでないため、[UIPanGestureRecognizer setTranslation:inView:] への呼び出しを無視します。

4

1 に答える 1

1

あなたのサンプルコードは不完全だと思います。TouchPreviewController (ストーリーボード、nib ファイル、または loadView) をインスタンス化する方法が明確ではありません。

私はクラスを使用したことがないので、左翼手でかなりアウトになる可能性があります.

親viewControllerですでにUITapGestureRecognizerをインスタンス化している場合、それはタップイベントを吸収しており、それらはTouchPreviewControllerに渡されません。

UITapGestureRecognizer を親の viewController にアタッチしてビュー階層を別の方法で実装し、そこで QLPreviewController のプレゼンテーションとアンロードを処理します。

nib ファイルから viewController をインスタンス化して QLPreviewController をサブクラス化する必要はないと思います。

親 viewController の UITapGestureRecognizer がイベントを取得したら、QLPreviewController をナビゲーション スタックにプッシュするか、終了時にナビゲーション スタックからポップします。

これが役立つことを願っています。

于 2012-07-10T03:39:37.610 に答える