That answer you referencedは私のお気に入りです。あなたの最初の要件は考慮していませんが、タップジェスチャ認識機能を追加するだけで非常にうまく処理できると思います。
"ClipView" あなたにそれを作成します。私たちは何をうまくする必要があります)
UITapGestureRecognizer *tapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
[self.myClipView addGestureRecognizer:tapGR];
// myClipView is the view that contains the paging scroll view
- (void)tap: (UITapGestureRecognizer *)gr {
// there are a few challenges here:
// 1) get the tap location in the correct coordinate system
// 2) convert that to which "page" was tapped
// 3) scroll to that page
}
チャレンジ1)課題2についてはlocationInView:
CGPoint location = [gr locationInView:self.scrollView];
に答えるジェスチャー認識に簡単おかげであり、あなたのスクロールビュー内のページがタップされました。これは、ページ幅を指定するとかなり単純な算術で行うことができます。私たちは、スクロール位置ストレート前方のITにページを変更することができますので、
今
// assuming you have something like this
#define kPAGE_WIDTH // some float
// page is just how many page-width's are represented by location.y
NSInteger page = floor(location.y/kPAGE_WIDTH);
、課題3)が...今
CGFloat y = page * kPAGE_WIDTH;
[self.scrollView setContentOffset:CGPointMake(y, 0.0f) animated:YES];
あるいは、すべてのコードの1つのチャンクで簡単です...
- (void)tap: (UITapGestureRecognizer *)gr {
CGPoint location = [gr locationInView:self.scrollView];
NSInteger page = floor(location.y/kPAGE_WIDTH);
CGFloat y = page * kPAGE_WIDTH;
[self.scrollView setContentOffset:CGPointMake(y, 0.0f) animated:YES];
}
EDIT
あなたはまた、除外することもできますジェスチャ認識プログラムからの "現在のページ"領域。これは、単にタップ法でテストを修飾することによって行われます。
唯一のトリックは...スクロールビューのフレーム、つまり、クリップビューと同じ座標系に
CGPoint locationInClipper = [gr locationInView:gr.view];
をタップ位置を取得することであり、SDKをテストするための良い方法を提供します。 ..
BOOL inScrollView = [self.scrollView pointInside:locationInClipper withEvent:nil];
そう...
- (void)tap: (UITapGestureRecognizer *)gr {
CGPoint locationInClipper = [gr locationInView:gr.view];
BOOL inScrollView = [self.scrollView pointInside:locationInClipper withEvent:nil];
if (!inScrollView) {
CGPoint location = [gr locationInView:self.scrollView];
NSInteger page = floor(location.y/kPAGE_WIDTH);
CGFloat y = page * kPAGE_WIDTH;
[self.scrollView setContentOffset:CGPointMake(y, 0.0f) animated:YES];
}
}
はありがとうございました!これは私の問題を完璧に解決し、答えはうまく設計されています。 – mlin956
タップジェスチャ認識装置が監視している領域を制限する方法はありますか?私は黄色と青色の領域がそれを観察したいだけです。私はステップ2で場所を計算する方法があることを知っています... – mlin956
確かに。編集を参照してください。 :-) – danh