5

キーボードで長い一日を過ごしたので、手を差し伸べています:-)

UIPageViewController基本的にAppleの標準テンプレートに従う典型的な実装があります。ユーザーがボタンをタッチして特定のページにジャンプしたり、View Controllerを閉じてアプリの別の部分に移動したりできるようにするオーバーレイを追加しようとしています。

私の問題はUIPageViewController、オーバーレイ サブビューからすべてのイベントがトラップされており、実行可能な解決策を見つけるのに苦労していることです。

例に役立つコードを次に示します...

ビューでDidLoad

// Page creation, pageViewController creation etc....

self.pageViewController.delegate = self;

[self.pageViewController setViewControllers:pagesArray
                                  direction:UIPageViewControllerNavigationDirectionForward
                                   animated:NO
                                completion:NULL];

self.pageViewController.dataSource = self;

[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];

// self.overlay being the overlay view

if (!self.overlay) 
{
   self.overlay = [[MyOverlayClass alloc] init];  // Gets frame etc from class init
   [self.view addSubview:self.overlay];
}

これはすべてうまくいきます。オーバーレイが作成され、UIPageViewController期待どおりにページの上部に表示されます。ページがめくると、オーバーレイの下でめくられます - これもまた、期待どおりです。

ただし、ビューUIButtonsself.overlayはタップ イベントを取得しません。はUIPageViewControllerすべてのイベントに応答します。

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touchここでの提案に従ってオーバーライドを試みましたが、成功しませんでした。

UIPageViewController ジェスチャー認識エンジン

すべてのイベントを手動でトラップして自分で処理しようとしましたが、うまくいきませんでした (正直なところ、うまくいったとしてもちょっとしたハックのように思えます)。

イベントをトラップする方法や、上にオーバーレイを使用するためのより良いアプローチについて提案がある人はいますかUIPageViewController

ありとあらゆる助けが大歓迎です!!

4

2 に答える 2

3

これらのジェスチャのデリゲートとして反復しUIPageViewController.GestureRecognizersて割り当て、実装してみてくださいself

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;

コードは次のようになります。

ビューでDidLoad

for (UIGestureRecognizer * gesRecog in self.pageViewController.gestureRecognizers)
{
        gesRecog.delegate = self;
}

そして、次のメソッドを追加します。

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if (touch.view != self.pageViewController.view]
    {
        return NO;
    }
    return YES;
}
于 2012-11-10T09:32:26.073 に答える