私はかなり単純なビュー構成を持っています:
A 、これUIViewController
に子供UIScrollView
とA がいます。可視領域から抜け出すのに十分な高さでを設定し(つまり、 より高く)、my の制約を固定の正の値 (たとえば) に設定します。UIImageView
UIScrollView
UIImageView
1024pt
Bottom space to superview
UIImageView
20
セットアップ全体が期待どおりに機能し、画像はその親でうまくスクロールします。ビューがスクロールされた場合 (ビューの一番下までスクロールすると、効果がより見やすくなります) が消え、再び表示される場合 (別のビューに切り替えて戻ってきた場合) を除き、スクロール値は復元されますが、スクロール ビューは、その親ビューの外側上部に移動されます。
これを説明するのは簡単ではありません。
ソース (またはストーリーボード) をテスト/表示したい場合は、コードを 1 行も編集していません。github に小さなデモを置きました: https://github.com/guillaume-algis/iOSAutoLayoutScrollView
iOS 6 の変更ログとこの特定のトピックに関する説明を読みましたが、これは 2 番目のオプション (純粋な自動レイアウト) の正しい実装だと思いますが、この場合、UIScrollView
動作が不安定なのはなぜですか? 何か不足していますか?
編集:これは#12580434 uiscrollview-autolayout-issueとまったく同じ問題です。誰かがこれを修正する適切な方法を見つけたので、答えは単なる回避策ですか、それともこれは iOS のバグですか?
EDIT 2:スクロール位置をユーザーが残した状態と同じ状態に保つ別の回避策を見つけました(これは12580434の受け入れられた回答に対する改善です):
@interface GAViewController ()
@property CGPoint tempContentOffset;
@end
@implementation GAViewController
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.tempContentOffset = self.mainScrollView.contentOffset;
self.scrollView.contentOffset = CGPointZero;
}
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
self.scrollView.contentOffset = self.tempContentOffset;
}
これは基本的に、オフセットを に保存viewWillAppear
し、原点にリセットしてから、 に値を復元しますviewDidAppear
。問題はこれら 2 つの呼び出しの間に発生しているようですが、その原因がわかりません。