1

1 つの imageView (プログラムで addSubView を使用して作成) を含む 1 つの ScrollView と、画像を変更するためのセグメント化されたコントロールを含む 1 つのビューがあります。ズーム用のジェスチャ認識機能を追加しました。セグメント化されたコントロールの水平位置は固定されています。この問題は、セグメント化されたコントロールをクリックしようとすると、画像がズームしすぎると発生します。うまくいきません。ズーム レベルが小さい場合、動作し続け、画像間で変化します。
以下の 2 つのスクリーンショットは、状況を示しています。1) セグメント化されたコントロールが機能する場合と、2) 機能しない場合。

http://cs617220.vk.me/v617220757/e375/hvRdXNe9SBY.jpg http://cs617220.vk.me/v617220757/e36e/E4auq4-kFL4.jpg

問題はビューの階層にあり、追加されたサブビューがセグメント化されたコントロールとビューをオーバーラップしない場合-機能し、オーバーラップすると停止すると思います。imageView を一番下に配置しようとしましたが、コードは次のとおりです。

[self.scrollView addSubview:self.imageView];
[self.scrollView sendSubviewToBack:self.imageView];

しかし、これは役に立ちません。問題は残ります。imageView をスタックの一番下に配置するにはどうすればよいですか?

コメントへの更新: UIScrollView とセグメント化されたコントロールの間に小さな UIView があります。どうやら問題をキャッチできたようです。それは水平固定コードです。これを見つけるためにRevealアプリを使用しました。2 つのスクリーンショットが問題を示しています。
全て大丈夫 ここでは、セグメント化されたコントロールが小さな UIView のすぐ上に配置されています。少しだけズームすると、画面は次のようになります。
UIView はスクロールしますが、セグメント化されたコントロールは適切な場所に留まります
したがって、UIView は画像の残りの部分と同じように消え、水平位置が固定されません。興味深いことに、セグメント化されたコントロールを UIScrollView に直接配置すると機能しますが、位置は水平方向に固定されません。これはコードです:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGRect frame = _floorSelector.frame;
    frame.origin.x = scrollView.contentOffset.x;
    _floorSelector.frame = frame;
}

そして、これは機能しません(セグメント化されたコントロールではなく、UIView の位置を修正しようとすると):

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

{
    CGRect frame = _selectorView.frame;
    frame.origin.x = scrollView.contentOffset.x;
    _selectorView.frame = frame;
}

解決策:
一方向のスクロールをブロックする代わりに、すべての補足ビューを取り除き、セグメント化されたビューの垂直スクロールを実装することにしました。コードは次のとおりです。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGRect frame = _floorSelector.frame;
    frame.origin.y = -scrollView.contentOffset.y;
    _floorSelector.frame = frame;
}

ビューの階層は次のとおりです。
階層を表示
したがって、セグメント化されたコントロールは、スクロール ビューではなく、メイン ビューに直接配置されます。縦スクロールの場合はスクロールしますが、横スクロールの場合はスクロールしません。手伝ってくれてありがとう。
Departamento B がこの問題を解決するのを手伝ってくれたので (これは彼のアイデアです)、私は彼の答えにチェックマークを付けます。

4

2 に答える 2

1

最終的に実装されたソリューションについては、元の質問を参照してください。

以下の元の回答:


垂直方向と水平方向のコントロールを別々に制御する:

  • ルートビュー
    • Scrollview -- 幅に合わせて垂直方向にスクロールし、高さはピンチでサイズが更新されます
      • 分割制御
      • Scrollview -- 親スクロールビューの高さに合わせ、幅はピンチで更新されます
        • 画像 -- ピンチで幅と高さが更新されます

懸念事項: 斜めスクロールはどの程度うまく機能しますか? 画面全体を再構築する前に、単純な静的ストーリーボード画面で試してみることをお勧めします。

私はこのアイデアをいじくり回してきましたが、外側のスクロールビューがすべてのタッチを取得するため、ジェスチャの転送に関して多くのコーディングを行う必要があります。

于 2014-06-15T03:30:56.883 に答える
0

どうやってするの

ビューを最初のインデックスに追加することで、ビューをスタックの一番下に配置できます。

[self.scrollViewinsertSubview:aView atIndex:0];

問題

ただし、scrollView に複数のサブビューがある場合、スクロールにはいくつかの問題があります。だからあなたがすべきこと:

解決

  1. ビューを作成して scrollView に追加する
  2. 作成したばかりのこのビューで、アイテムを追加します (インデックス 0 の yourImageView で、segmentedView を追加した後)。
  3. 以下のコードに従ってください

コード

//adding your view, as a subview of scrollView
[self.scrollView addSubview:self.yourView atIndex:0];

//On your view insert at index 0 your self.imageView
[self.yourView sendSubviewToBack:self.imageView atIndex:0];

//Now add your segmentedView
[self.yourView sendSubviewToBack:self.segmentedView];
于 2014-06-15T17:25:48.373 に答える