1. ホーム
  2. ios

[解決済み] UIScrollViewの水平ページングをMobile Safariのタブのようにする。

2023-04-11 22:12:59

質問

モバイルSafariでは、下部にページコントロールがあるUIScrollViewのような水平ページングビューに入ることで、ページを切り替えることができます。

私は、水平方向にスクロール可能な UIScrollView が次のビューのコンテンツの一部を表示する、この特定の動作を再現しようとしています。

Apple が提供する例です。PageControl は、水平ページングに UIScrollView を使用する方法を示していますが、すべてのビューが画面幅全体を占めています。

モバイルSafariが行うように、UIScrollViewが次のビューのいくつかのコンテンツを表示するようにするにはどうしたらよいでしょうか。

どのように解決するのですか?

A UIScrollView は、ページングを有効にすると、フレームの幅 (または高さ) の倍数で停止します。 ですから、最初のステップは、ページの幅を決めることです。 その幅を UIScrollView . 次に、サブビューのサイズを必要な大きさに設定し、その中心を の倍数で設定します。 UIScrollView の幅の倍数に基づいて中心を設定します。

次に、他のページも見たいので、もちろん clipsToBoundsNO に変更しました。 の範囲外でドラッグを開始したときにスクロールするようにすることです。 UIScrollView のフレームの範囲外でユーザーがドラッグを開始したときにスクロールするようにすることです。 私の解決策は(ごく最近これをしなければならなかったとき)次のようなものでした。

を作成します。 UIView のサブクラス(つまり ClipView ) を含むことになります。 UIScrollView とそのサブビューを含むものです。 基本的に、これは UIScrollView が持っていると想定されるフレームを持つ必要があります。 このように UIScrollView の中央に ClipView . 必ず ClipView 's clipsToBounds に設定されているのは YES に設定されます。 また ClipView への参照が必要です。 UIScrollView .

最後のステップは - (UIView *)hitTest:withEvent: の内部で ClipView .

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
  return [self pointInside:point withEvent:event] ? scrollView : nil;
}

これは基本的に、タッチエリアである UIScrollView のタッチエリアをその親のビューのフレームに拡大します。

もう一つの方法は、サブクラス UIScrollView を継承し、その - (BOOL)pointInside:(CGPoint) point withEvent:(UIEvent *) event メソッドをオーバーライドしても、クリッピングを行うコンテナビューは必要であり、また、いつ YES を返すタイミングを決めるのは難しいかもしれません。 UIScrollView のフレームのみに基づいています。

NOTE また、ジュリ・パカステの hitTest:withEvent:モディフィケーションを参照してください。 を参照してください。