注意: この質問と回答に関するバグは、iOS 7 で修正されたようです。この回答の残りの部分は、iOS 6 (およびおそらくそれ以前) にのみ関連しています。
ここで示されている動作は、UIScrollView
クラスのバグです。UIViewController
OPで指摘されているように、モーダルに表示されたから を含むシーンに戻った後、UIScrollView
はUIScrollView
現在スクロールされているポイントを取得し、それが原点であるかのように動作し始めます。つまり、別のビュー コントローラーをモーダルに表示する前にスクロール ビューを下にスクロールした場合、スクロール ビューでシーンに戻ったときに上にスクロールすることはできません。
ウィンドウを変更しなくても、スクロール ビューをビュー階層から削除して再度追加すると、同じことが起こります。
これを回避するには、モーダル ビュー コントローラーを閉じた後contentOffset
、スクロール ビューが再び表示される前に設定を戻します。{0,0}
ユーザーがモーダルをトリガーする前にスクロールしたポイントを実際に保持したい場合は、が再表示された後、リセットする前の状態に戻すことができます。UIScrollView
contentOffset
UIScrollView
モーダルから戻るたびにスクロール ビューを一番上にリセットせずにバグを修正するサブクラスを次に示します。
@interface NonBuggedScrollView : UIScrollView
@end
@implementation NonBuggedScrollView {
CGPoint oldOffset;
}
-(void)willMoveToWindow:(UIWindow *)newWindow {
oldOffset = self.contentOffset;
self.contentOffset = CGPointMake(0,0);
}
-(void)willMoveToSuperview:(UIView *)newSuperview {
oldOffset = self.contentOffset;
self.contentOffset = CGPointMake(0,0);
}
-(void)didMoveToWindow {
self.contentOffset = oldOffset;
}
-(void)didMoveToSuperview {
self.contentOffset = oldOffset;
}
@end
サブクラスではなく でこれを行いたい場合は、 メソッドと メソッドでコンテンツ オフセットをUIViewController
変更します。UIScrollView
viewWillAppear:
viewDidAppear
OPが要求したように、モーダルから戻ったときにユーザーのスクロール位置を保持したくない場合、UIScrollView
必要なのはさらに簡単です:
@interface NonBuggedScrollView : UIScrollView
@end
@implementation NonBuggedScrollView
-(void)willMoveToWindow:(UIWindow *)newWindow {
self.contentOffset = CGPointMake(0,0);
}
-(void)willMoveToSuperview:(UIView *)newSuperview {
self.contentOffset = CGPointMake(0,0);
}
@end