6

私のアプリケーションには、1 つのサブビューを持つ UIScrollView があります。サブビューは、drawLayer イベントのレイヤーを使用して PDF ページをそれ自体に印刷する拡張 UIView です。

組み込みのピンチを使用したズームはうまく機能します。setZoomScale も期待どおりに機能します。

zoomToRect 関数に苦労しています。特定のCGPointからCGRect zoomRect変数を作成するオンラインの例を見つけました。

touchesEnded関数では、ダブルタップがあり、それらが完全にズームアウトされている場合、ダブルタップしたピンチの中心でピンチアウトしているかのように、作成した PDFUIView をズームインしたいと考えています。

したがって、ダブルタップした場合に zoomToRect を利用する関数に UITouch 変数を渡すとします。

私はリンゴのサイトで見つけた次の機能から始めました:

http://developer.apple.com/iphone/library/documentation/WindowsViews/Conceptual/UIScrollView_pg/ZoomZoom/ZoomZoom.html

以下は、私の UIScrollView 拡張クラスの修正版です。

- (void)zoomToCenter:(float)scale withCenter:(CGPoint)center {     

    CGRect zoomRect;
    zoomRect.size.height = self.frame.size.height / scale;
    zoomRect.size.width  = self.frame.size.width  / scale;

    zoomRect.origin.x = center.x - (zoomRect.size.width  / 2.0);
    zoomRect.origin.y = center.y - (zoomRect.size.height / 2.0); 

    //return zoomRect;

    [self zoomToRect:zoomRect animated:YES];

} 

これを行うと、UIScrollView は中央ではなく上の zoomRect の右下端を使用してズームするように見えます。

このようにUIViewを作ると

UIView *v = [[UIView alloc] initWithFrame:zoomRect]; 
[v setBackgroundColor:[UIView redColor]];
[self addSubview:v];

赤いボックスが表示され、タッチ ポイントが中央で死んでいます。

注: 私は PC からこれを書いています。Mac で 2 分割の部分をいじったことを思い出したので、タッチ ポイントが中央にある四角形が描画されると仮定してください。UIView が中心から外れていても、正しい場所にズームされていれば問題ありません。

ただし、zoomToRect を実行すると、ズームイン結果の左上にある zoomRect の右下を使用しているように見えます。

また、UIScrollView をクリックする場所に応じて、さまざまな場所に固定されることに気付きました。真ん中にクロスがあり、ポイントを反映しているように見えますが、真ん中の左側のどこかが負の反射であり、中央の右側のどこかが正の反射ですか?

これは複雑に思えますが、UIView が描画できたので、描画された四角形にズームするだけではいけませんか?

高品質でスケーリングする PDF を作成する方法を理解するために多くの調査を行ったので、CALayer を使用すると座標系から外れている可能性があると思いますか? しかし、UIScrollView に対しては、768x985 のサイズのビューとして扱う必要があります。

これは一種の上級者向けです。zoomRect を作成するコードはすべて適切であると想定してください。UIScrollView にある UIView の CALayer には、より深いものがあります。

4

9 に答える 9

5

わかりました別の答え:

Appleが提供するルーチンは私にとってはうまくいきますが、ジェスチャ認識エンジンでタップポイントをスクローラーではなくimageView座標に変換する必要があります。

Apple の例ではこれを行っていますが、アプリの動作が異なる (UIImageView を変更する) ため、uiscrollview にgestureReconnizer が設定されています。これは正常に動作しますが、handleDoubleTap でこれを行う必要があります。

これは、Apple のサンプル コード「TaptoZoom」に大まかに基づいていますが、前述したように、スクロール ビューにジェスチャ認識機能を接続する必要がありました。

- (void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer {
    // double tap zooms in
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(handleSingleTap:) object:nil];
    float newScale = [imageScrollView zoomScale] * 1.5;
    // Note we need to get location of the tap in the imageView coords, not the imageScrollView
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:imageView]];
    [imageScrollView zoomToRect:zoomRect animated:YES];
}
于 2011-03-09T13:20:05.233 に答える
4
   Declare BOOL isZoom; in .h


     -(void)handleDoubleTap:(UIGestureRecognizer *)recognizer {  
            if(isZoom){
                CGPoint Pointview=[recognizer locationInView:self];
                CGFloat newZoomscal=3.0;

                newZoomscal=MIN(newZoomscal, self.maximumZoomScale);

                CGSize scrollViewSize=self.bounds.size;

                CGFloat w=scrollViewSize.width/newZoomscal;
                CGFloat h=scrollViewSize.height /newZoomscal;
                CGFloat x= Pointview.x-(w/2.0);
                CGFloat y = Pointview.y-(h/2.0);

                CGRect rectTozoom=CGRectMake(x, y, w, h);
                [self zoomToRect:rectTozoom animated:YES]; 

                [self setZoomScale:3.0 animated:YES]; 
                isZoom=NO;
            }
            else{ 
                [self setZoomScale:1.0 animated:YES]; 
                isZoom=YES;
            }
        } 
于 2013-06-12T06:49:51.353 に答える
1

zoomRect の原点が正しくないため、画像が 1 未満の zoomScale で開始されている場合、使用しているリンゴが適切にズームされないことに気付きました。正しく動作するように編集しました。コードは次のとおりです。

- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center {

CGRect zoomRect;

// the zoom rect is in the content view's coordinates. 
//    At a zoom scale of 1.0, it would be the size of the imageScrollView's bounds.
//    As the zoom scale decreases, so more content is visible, the size of the rect grows.
zoomRect.size.height = [self frame].size.height / scale;
zoomRect.size.width  = [self frame].size.width / scale;


// choose an origin so as to get the right center.
zoomRect.origin.x = (center.x * (2 - self.minimumZoomScale) - (zoomRect.size.width  / 2.0));
zoomRect.origin.y = (center.y * (2 - self.minimumZoomScale) - (zoomRect.size.height / 2.0));

return zoomRect;
}

重要なのは、中心値に (2 - self.minimumZoomScale) を掛けるこの部分です。お役に立てれば。

于 2010-11-23T18:45:14.297 に答える
1

私の場合は次のとおりでした。

zoomRect.origin.x    = center.x / self.zoomScale - (zoomRect.size.width  / 2.0);
zoomRect.origin.y    = center.y / self.zoomScale  - (zoomRect.size.height / 2.0);
于 2011-02-16T10:20:16.770 に答える
0

中心の座標になんらかの係数を掛けてはならないという上記のコメントの 1 つには同意しません。

現在、400x400px の画像または PDF ファイル全体を 100x100 のスクロール ビューで表示していて、ユーザーがコンテンツのサイズを 1:1 になるまで倍増できるようにしたいとします。ポイント (75,75) をダブルタップすると、拡大された四角形の原点が 100,100 で、新しい 200x200 コンテンツ ビュー内でサイズが 100x100 になることが期待されます。したがって、元のタッピング ポイント (75,75) は、新しい 200x200 スペースでは (150,150) になります。

ここで、ズーム アクション #1 が完了した後、新しい 100x100 の長方形 (より大きな 200x200 の長方形の右下の正方形) 内の (75,75) を再度ダブルタップすると、ユーザーに下部が表示されることが期待されます。 -大きい画像の右の 100x100 正方形。400x400 ピクセルにズームされます。

より大きな 400x400 の長方形内にあるこの最新の 100x100 の長方形の原点を計算するには、スケールと現在のコンテンツのオフセットを考慮する必要があります (この最後のズーム アクションの前に、200x200 のコンテンツの長方形内に右下の 100x100 の長方形を表示していたため)。 .

したがって、最終的な長方形の x 座標は次のようになります: center.x/currentScale - (scrollView.frame.size.width/2) + scrollView.contentOffset.x/currentScale = 75/.5 - 100/2 + 100/.5 = 150 - 50 + 200 = 300。

この場合、正方形なので、y 座標の計算は同じです。実際に、右下の 100x100 の長方形を拡大しました。これは、より大きな 400x400 のコンテンツ ビューでは原点 300,300 です。

ズーム四角形のサイズと原点を計算する方法は次のとおりです。zoomRect.size.width = mScrollView.frame.size.width/scale;

zoomRect.origin.x = center.x/currentScale - (mScrollView.frame.size.width/2) + mScrollView.contentOffset.x/currentScale;
zoomRect.origin.y = center.y/currentScale - (mScrollView.frame.size.height/2) + mScrollView.contentOffset.y/currentScale;

これが理にかなっていることを願っています。さまざまな正方形/長方形をスケッチせずに書面で説明することは困難です.

乾杯、ラフ・コラサンテ

于 2011-10-14T00:25:03.603 に答える
0

私はさまざまな解決策を試しましたが、これが最良の解決策のようです。それは本当に簡単で概念的なものですか?

CGRect frame = [[UIScreen mainScreen] applicationFrame];
scrollView.contentInset = UIEdgeInsetsMake(frame.size.height/2,
                 frame.size.width/2,
                 frame.size.height/2,
                 frame.size.width/2); 
于 2011-04-01T15:15:36.850 に答える
0

同様のことがありましたが、それは、center.x と center.y の値をスケールで割って調整しなかったためです (center.x/scale と center.y/scale を使用)。多分私はあなたのコードを正しく読んでいません。

于 2010-04-30T16:06:07.300 に答える
0

私は同じ動作をしており、非常にイライラしています... UIScrollView に供給される四角形は完璧です. 、何があっても。

私は zoomScale を変更しようとしました、私は zoomToRect を試しました、私はそれらすべてを試しました、そしてコードで zoomScale に触れるたびに、それは座標 0,0 になります。

また、ズーム操作後にスクロールビューのサイズ変更された画像に setContentSize を明示的に追加する必要がありました。そうしないと、ズームまたはピンチ後にスクロールできません。

これは 3.1.3 のバグですか?

于 2010-08-24T05:48:02.120 に答える