2

プログラムでコンテナー ビューにサブビューとして追加された、WKWebView のサブクラスである XWalkView を使用しています。WKWebView のコンテンツ ページをズームしようとしていますが、初めてズームしません。WKWebView はその後コンテンツ ページをズームします。つまり、ピンチ ズームまたはダブル タップ ズームを行うと、WKWebView 自体またはコンテナー ビュー (私の推測) がズームされ、その後、ズーム ジェスチャを再度実行すると、コンテンツ ページがズームされます (これは予想される動作です)。

問題は、ズーム ジェスチャが実行されるたびに WKWebView のコンテンツ ページをズームする方法です。

私は以下のようUIScrollViewDelegateに私のプロトコルに準拠してViewController.hいます:

@interface ViewController : UIViewController<UIScrollViewDelegate, WKNavigationDelegate, WKUIDelegate>

以下のようにデリゲートを self に設定してviewDidLoadいます。

xWalkView.scrollView.delegate = self;

以下のようにズームスケールを設定viewDidLoadします。

xWalkView.scrollView.minimumZoomScale = 1;
xWalkView.scrollView.maximumZoomScale = 6;

ViewController.m&以下のようにプロトコル メソッドを実装します。

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    if (shouldPageNotZoom) {
        NSLog(@"viewForZoomingInScrollView YES");
        return nil;
    } else {
        NSLog(@"viewForZoomingInScrollView NO");
        return xWalkView.scrollView.subviews[0];
    }
}

-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {

}

BOOL shouldPageNotZoom を使用しており、ズームが必要かどうかに応じて、URL に基づいて YES または NO に設定しています。ズームが必要なページでは、else ブロック ( NSLog(@"viewForZoomingInScrollView NO");) のログがログ領域に出力され、ズームが不要なページでは if ブロック ( NSLog(@"viewForZoomingInScrollView YES");) のログが表示されます。これは機能しています。唯一の問題は、コンテンツ ページが最初のズーム ジェスチャではズームせず、代わりに WKWebView またはコンテナー ビューがズームされますが (私は推測します)、その後のズーム ジェスチャではズームします。

いくつかの観察の後、スクロールビューのインデックス0のサブビューが最初とその後にズームされていることがわかりました(ただし、コンテンツページは最初ではなく2回目にズームされます)viewForZoomingInScrollView. そうあるべきで、そうです。タグ値を各ビューに割り当て、scrollViewDidEndZooming以下のようにログ領域のメソッドにタグ値を記録してタグ値を確認することでこれを行いました。

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    if (shouldPageNotZoom) {
        NSLog(@"viewForZoomingInScrollView YES");
        return nil;
    } else {
        NSLog(@"viewForZoomingInScrollView NO");
        xWalkView.scrollView.tag = 20;
        xWalkView.tag = 15;
        xWalkView.scrollView.subviews[0].tag = 10;
        _containerView.tag = 5;
        return xWalkView.scrollView.subviews[0];
    }
}

-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {
    NSLog(@"tag %li", (long) view.tag);
}

以下のログを与える:

2017-11-28 17:21:36.610753+0530 MyApp[4614:241659] tag 10 //Getting this 1st time of zooming
2017-11-28 17:21:59.369461+0530 MyApp[4614:241659] tag 10 //Getting this at subsequent zooms 

何が欠けているのかわからない。

説明が必要な場合はコメントしてください。

4

1 に答える 1