これは、インターネット上でこの質問に最適なリソースのようです。別の密接な解決策は、ここで見つけることができます。
私はこの問題を別の方法で非常に満足のいく方法で解決しました。本質的には、私自身のジェスチャ認識機能を方程式に置き換えることによってです。元の投稿者が要求した効果を達成しようとしている人は誰でも、UIScrollView
.
次のプロセスにより、以下が提供されます。
まず、View Controller とそのビューがあるとします。IB では、ビューを scrollView のサブビューにし、サイズが変更されないようにビューのサイズ変更ルールを調整します。スクロールビューの属性で、「バウンス」と表示されているものをすべてオンにし、「 」をオフdelaysContentTouches
にします。また、ズームの最小値と最大値をデフォルトの 1.0 以外に設定する必要があります。これは、Apple のドキュメントにあるように、ズームが機能するために必要です。
のカスタム サブクラスを作成し、UIScrollView
このスクロール ビューをそのカスタム サブクラスにします。スクロールビュー用のビュー コントローラーにアウトレットを追加し、それらを接続します。これで完全に構成されました。
次のコードをUIScrollView
サブクラスに追加して、タッチ イベントを透過的に渡す必要があります (サブクラスを完全にバイパスすることで、よりエレガントに実行できると思います)。
#pragma mark -
#pragma mark Event Passing
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.nextResponder touchesBegan:touches withEvent:event];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
[self.nextResponder touchesMoved:touches withEvent:event];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[self.nextResponder touchesEnded:touches withEvent:event];
}
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
return NO;
}
次のコードをビュー コントローラーに追加します。
- (void)setupGestures {
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)];
[self.view addGestureRecognizer:pinchGesture];
[pinchGesture release];
}
- (IBAction)handlePinchGesture:(UIPinchGestureRecognizer *)sender {
if ( sender.state == UIGestureRecognizerStateBegan ) {
//Hold values
previousLocation = [sender locationInView:self.view];
previousOffset = self.scrollView.contentOffset;
previousScale = self.scrollView.zoomScale;
} else if ( sender.state == UIGestureRecognizerStateChanged ) {
//Zoom
[self.scrollView setZoomScale:previousScale*sender.scale animated:NO];
//Move
location = [sender locationInView:self.view];
CGPoint offset = CGPointMake(previousOffset.x+(previousLocation.x-location.x), previousOffset.y+(previousLocation.y-location.y));
[self.scrollView setContentOffset:offset animated:NO];
} else {
if ( previousScale*sender.scale < 1.15 && previousScale*sender.scale > .85 )
[self.scrollView setZoomScale:1.0 animated:YES];
}
}
このメソッドには、View Controller のクラス ファイルで定義する必要がある多くのプロパティへの参照があることに注意してください。
CGFloat previousScale;
CGPoint previousOffset;
CGPoint previousLocation;
CGPoint location;
わかりました!
残念ながら、ジェスチャー中に scrollView にスクローラーを表示させることができませんでした。私はこれらの戦略をすべて試しました:
//Scroll indicators
self.scrollView.showsVerticalScrollIndicator = YES;
self.scrollView.showsVerticalScrollIndicator = YES;
[self.scrollView flashScrollIndicators];
[self.scrollView setNeedsDisplay];
私が本当に楽しんだことの 1 つは、最後の行を見ると、約 100% の最終的なズームを取得し、それに合わせて丸めていることに気付くでしょう。許容レベルを調整できます。これは Pages のズーム動作で見たことがあり、いい感じだと思いました。