31

自動レイアウト(多分)とスクロールビューに問題があります!

私の問題

  1. 下にスクロールします 意見

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

3.次に戻ると、scrollviewがそのように見え、最高点までスクロールできません(scrollviewのバウンスで表示されます) スクロールビュー

誰か助けてもらえますか?

4

9 に答える 9

40

含まれているViewControllerの次のコードスニペットも、明示的なサイズに依存することなく、問題を解決しているようです。

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

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

于 2012-11-10T21:36:25.253 に答える
11

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

于 2012-11-02T14:10:48.423 に答える
6

私はアダムのソリューションを使用していましたが、animated: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;
    }
}
于 2013-01-29T18:45:48.873 に答える
3

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

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

于 2012-12-07T07:39:53.353 に答える
1

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

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [scrollView setContentOffset:CGPointZero animated:NO];
}
于 2013-08-05T22:45:11.127 に答える
1

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;
}
于 2013-08-29T10:16:18.850 に答える
1

これを試しましたか?

self.automaticallyAdjustsScrollViewInsets = NO;

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

于 2014-04-04T12:05:06.120 に答える
0

私も同じ問題を抱えていました。コンテンツビューのy-centerをスーパービューのy-centerに揃える制約を設定していたことがわかりました。この制約を削除すると、問題なく機能しました。

于 2013-02-19T22:06:20.367 に答える
0

これを試して

@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;
}
于 2014-07-28T09:18:00.517 に答える