Autolayout(たぶん)と私のスクロールビューに問題があります!
私の問題
2.次に、別のビューにプッシュします
3.次に戻ると、scrollviewはそのようになり、最高点までスクロールできません(scrollviewのバウンスに表示されます)。
誰かが私を助けてくれますか?
含まれているビューコントローラー内の次のコードスニペットも、明示的なサイズに依存せずに問題を解決するようです。
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
self.mainScrollView.contentOffset = CGPointZero;
}
コンテンツのオフセットをOriginにリセットしますが、他の回答もリセットするようです。
あなたがまだ答えを探しているなら、私は今日壁をヘッドバンギングして2日後にそれを見つけました。コードを貼り付けますが、最も重要なのはscrollViewをロードするときです。
_ -(void)viewWillAppear:(BOOL)animated{
[scrollView setFrame:CGRectMake(0, 0, 320, 800)];
}
-(void)viewDidAppear:(BOOL)animated
{
[scrollView setScrollEnabled:YES];
[scrollView setContentSize:CGSizeMake(320, 800)];
}
_
これはすべて-(void)viewDidLoad
の前にロードされます
高さが両方のインスタンスで800であることに注意してください。これは、この問題を解決するために重要です。あなたのプロジェクトで頑張ってください;)
私はadamのソリューションを使用していましたが、animationed:YESで却下すると問題が発生し始めました。私のコードでは、viewWillAppearの後にコンテンツオフセットが設定されています(viewWillAppearが早すぎるようです)。
- (void)viewDidDisappear:(BOOL)animated
{
self.scrollOffsetToPersist = self.scrollView.contentOffset;
self.scrollView.contentOffset = CGPointZero;
[super viewDidDisappear:animated];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSOperationQueue mainQueue] addOperationWithBlock:^
{
self.scrollView.contentOffset = self.scrollOffsetToPersist;
}];
}
編集:別のより良い方法は、viewDidLayoutSubviewsでリセットすることです:)
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if(!CGPointEqualToPoint(CGPointZero, self.scrollOffsetToPersist))
{
self.scrollView.contentOffset = self.scrollOffsetToPersist;
self.scrollOffsetToPersist = CGPointZero;
}
}
これは素晴らしいことではありませんが、自動レイアウトが発生した後で、viewDidAppearでコンテンツサイズを設定し、scrollOffsetを設定し、viewDidDisappearでスクロールオフセットを永続化してから、スクロールオフセットは、viewDidAppearの永続化された状態に戻ります。
このような:
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:YES];
self.scrollView.contentSize = self.scrollViewInnerView.frame.size;
self.scrollView.contentOffset = [self.scrollOffsetToPersist CGPointValue];
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:YES];
self.scrollOffsetToPersist = [NSValue valueWithCGPoint:self.scrollView.contentOffset];
self.scrollView.contentOffset = CGPointZero;
}
まったくエレガントではありませんが、機能するので共有したいと思いました。
私はUITabBarControllerと自動レイアウトの異なるビューを使用しています。ビューはデバイスの画面よりも長くなります。 1つのタブから別のタブに切り替えると、説明した問題が発生する場合があります。これは、切り替え前にビューが下にスクロールされた場合にのみ発生しました。ここですべてのアドバイスを試しましたが、私の場合はうまくいきませんでした。私の解決策は、ビューを離れる前に再び上にスクロールすることでした。少なくともiOS 6のこのバグの回避策:
-(void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[scrollView setContentOffset:CGPointZero animated:NO];
}
AutoLayoutが適用される前に、ScrollViewがContentOffsetを設定する問題が発生しました。解決策は次のとおりです。
プライベートプロパティを作成する
@property (assign,nonatomic) CGPoint scrollviewContentOffsetChange;
コードを追加してメソッドを表示する
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.scrollView.contentOffset = CGPointZero;
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.scrollviewContentOffsetChange = self.scrollView.contentOffset;
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
self.scrollView.contentOffset = self.scrollviewContentOffsetChange;
}
これを試しましたか?
self.automaticallyAdjustsScrollViewInsets = NO;
私の場合、これが私の問題を解決したものです。
これを試して
@property (nonatomic, assign) CGPoint scrollViewContentOffsetChange;
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.scrollView.contentOffset = CGPointZero;
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.scrollViewContentOffsetChange = _scrollView.contentOffset;
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
_scrollView.contentOffset = self.scrollViewContentOffsetChange;
}
私も同じ問題を抱えていました。結局、コンテンツビューのy中心をスーパービューのy中心に合わせて制約を設定していることがわかりました。この制約を削除したところ、問題なく動作しました。