私の質問は: 私のアプリでは、このようなものを使用して実現したいUIScrollView
彼のUIScrollView
すべての内容が中に入っています。しかし、画面の上部 (または画面の下部) に到達したときに、AppStore (iOS 6) のようなコンテンツを固定したいと考えています。
この場合、「詳細」、「レビュー」、および「関連」ボタンはスクロールを停止し、上部に固定されたままになります。
誰でもどうすればよいか考えていますか?
私の質問は: 私のアプリでは、このようなものを使用して実現したいUIScrollView
彼のUIScrollView
すべての内容が中に入っています。しかし、画面の上部 (または画面の下部) に到達したときに、AppStore (iOS 6) のようなコンテンツを固定したいと考えています。
この場合、「詳細」、「レビュー」、および「関連」ボタンはスクロールを停止し、上部に固定されたままになります。
誰でもどうすればよいか考えていますか?
スクロールビューにデリゲートがない場合は、デリゲートを指定します。これはおそらくビューコントローラになります。
また、デリゲートにフローティングビューへの参照を提供します。(この例では、フローティングビューには「Dettagli」、「Recensioni」、および「Correlati」ボタンが含まれ、フローティングビューは三角形のノッチがある場所で透明であり、シャドウもフローティングビューの一部です。)フローティングビューは、スクロールビューのサブビューである必要があります。
フローティングビューのフレームの「通常の」Y座標をインスタンス変数に保存します。たとえば、デリゲートがView Controllerである場合は、おそらく次の場所で実行する必要がありますviewDidLoad
。
- (void)viewDidLoad {
[super viewDidLoad];
originalFloatingViewY = floatingView.frame.origin.y;
}
デリゲートのscrollViewDidScroll:
方法で、スクロールビューがフローティングビューの「通常の」位置の上部より下にスクロールされているかどうかを確認します。その場合は、フローティングビューを表示領域の上端に移動します。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
[self updateFloatingViewFrame];
}
- (void)updateFloatingViewFrame {
CGPoint contentOffset = scrollView.contentOffset;
// The floating view should be at its original position or at top of
// the visible area, whichever is lower.
CGFloat y = MAX(contentOffset.y, originalFloatingViewY);
CGRect frame = floatingView.frame;
if (y != frame.origin.y) {
frame.origin.y = y;
floatingView.frame = frame;
}
}
サブクラス化UIScrollView
してオーバーライドすることによってもそれを行うことができますlayoutSubviews
。この手法の詳細については、 WWDC2011の「AdvancedScrollViewTechniques」ビデオをご覧ください。
UIScrollView's
これは、スクロールのためにデリゲート メソッド ( scrollViewDidScroll
:) で処理する必要があります。y
がその特定の値に達したら、scrollview
この方向のスクロールのみを無効にする必要があります。そこにif条件を追加して、y
スクロール中にポイントをチェックしてリセットするだけです。このためには、この特定の部分を下のコンテンツの外側の別のスクロール ビューとして保持し、下のスクロール ビューの上方向の動きに合わせて移動する必要がある場合があります。