web-dev-qa-db-ja.com

UIScrollview Autolayoutの問題

Autolayout(たぶん)と私のスクロールビューに問題があります!

私の問題

  1. 下にスクロール View

2.次に、別のビューにプッシュします

3.次に戻ると、scrollviewはそのようになり、最高点までスクロールできません(scrollviewのバウンスに表示されます)。 Scrollview

誰かが私を助けてくれますか?

30

含まれているビューコントローラー内の次のコードスニペットも、明示的なサイズに依存せずに問題を解決するようです。

- (void)viewDidDisappear:(BOOL)animated {
  [super viewDidDisappear:animated];
  self.mainScrollView.contentOffset = CGPointZero;
}

コンテンツのオフセットをOriginにリセットしますが、他の回答もリセットするようです。

40
user1071136

あなたがまだ答えを探しているなら、私は今日壁をヘッドバンギングして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であることに注意してください。これは、この問題を解決するために重要です。あなたのプロジェクトで頑張ってください;)

11
kadore

私は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;
    }
}
6
Kukosk

これは素晴らしいことではありませんが、自動レイアウトが発生した後で、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;
}

まったくエレガントではありませんが、機能するので共有したいと思いました。

3
Adam Waite

私はUITabBarControllerと自動レイアウトの異なるビューを使用しています。ビューはデバイスの画面よりも長くなります。 1つのタブから別のタブに切り替えると、説明した問題が発生する場合があります。これは、切り替え前にビューが下にスクロールされた場合にのみ発生しました。ここですべてのアドバイスを試しましたが、私の場合はうまくいきませんでした。私の解決策は、ビューを離れる前に再び上にスクロールすることでした。少なくともiOS 6のこのバグの回避策:

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [scrollView setContentOffset:CGPointZero animated:NO];
}
1
Frankenstein

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;
}
1
Ratha Hin

これを試しましたか?

self.automaticallyAdjustsScrollViewInsets = NO;

私の場合、これが私の問題を解決したものです。

1
Lukas

これを試して

@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;
}
0
Jimvanced

私も同じ問題を抱えていました。結局、コンテンツビューのy中心をスーパービューのy中心に合わせて制約を設定していることがわかりました。この制約を削除したところ、問題なく動作しました。

0
mimc