2016-08-11 10 views
1

私はUIScroll Viewを使用してページング機能を備えたギャラリー風のUIを作成しています。基本的には次のように:UIScrollViewインタラクティブ領域を展開し、スワイプとタップを区別する

enter image description here

私は、ページングを必要とするので、私はscrollviewの幅は、私の例では、単一のページの幅にピンクの長方形の幅を等しく設定しているので。

しかし、私は2つの余分なものとします

  1. 黄色や青色の領域をタップするが、中心に対応する矩形をもたらすでしょう。
  2. 黄色または青色の領域(スクロールビューの外)でスクロール/スワイプすることができます。つまり、画面の幅全体がスクロール可能です。

this threadに続き、- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)eventを加えた。 BUTそうすることで、私は2番目の目標を達成できます。黄色と青のタッピング反応を処理するセレクタまたはデリゲートを設定すると、機能しません。それについてどんな考えですか?

答えて

1

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]; 
    } 
} 
+0

はありがとうございました!これは私の問題を完璧に解決し、答えはうまく設計されています。 – mlin956

+0

タップジェスチャ認識装置が監視している領域を制限する方法はありますか?私は黄色と青色の領域がそれを観察したいだけです。私はステップ2で場所を計算する方法があることを知っています... – mlin956

+0

確かに。編集を参照してください。 :-) – danh

関連する問題