1

UIScrollViewタブ バーの項目をクリックして別の ViewController に切り替えてから、ViewController にUIScrollView戻ると、上部にスクロールできませんという問題が発生します。ViewControllers を再度切り替える必要があり、その後、コンテンツUIScrollViewが正しく表示されます。この手順は、ユーザーにとって非常に不快です。これは私のコードです:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self becomeFirstResponder];  // View as first responder

    scrollView.scrollEnabled = YES;
    [scrollView setUserInteractionEnabled:YES];
    testLabel.text = @"there is a long, long text normally";   
}

UIScrollViewはこのラベルに応じて正しい高さを自動的に取得するため、意図的に contentSize を設定しませんでした。私の問題は、下にスクロールしてから別のViewControllerに切り替えると、この画面に戻ってきたときに、もう上にスクロールできないことです。

詳細情報: 自動レイアウトが使用され、階層は次のとおりです: ViewController - View - UIScrollView - Label, ...

4

2 に答える 2

6

私はこれとまったく同じ問題に苦しんでいます!残念ながら、何が起こっているのか、それを引き起こしているのか (Apple 側のバグ?) を正確に把握することはできませんでしたが、かなり効果的と思われる回避策を作成しました。

私がやっているのは、viewWillDissapear メソッドで、スクロールビューの境界の高さの位置をローカルの float 変数に保存してから、スクロールビューを完全に一番上にリセットすることです。

次に、didLayoutSubviews メソッドで、保存した位置にスクロールして戻ります。

これが私のコードです。

最後のスクロール値を格納するための変数を設定し、遅延インスタンス化します。

@property (nonatomic) float lastScrollHeight;

@synthesize lastScrollHeight = _lastScrollHeight;

-(float)lastScrollHeight{
    if(!_lastScrollHeight) _lastScrollHeight = 0;
    return _lastScrollHeight;
}

ビューがサブビューをレイアウトした後、保存された値までスクロールします (最初はゼロになります)。

-(void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];
    [self.scrollView setContentOffset:CGPointMake(0.0f, self.lastScrollHeight) animated:NO];
}

ビューが消えるたびに、スクロールビューを完全に「リセット」します。

-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    self.lastScrollHeight = self.scrollView.bounds.origin.y;
    [self resetApplesBrokenScrollview];
}

-(void)resetApplesBrokenScrollview{
    [self.scrollView setContentOffset:CGPointZero];
    CGRect sFrame = self.scrollView.bounds;
    sFrame.origin = CGPointZero;
    self.scrollView.bounds = sFrame;
    CGRect cFrame = self.contentView.frame;
    cFrame.origin = CGPointZero;
    self.contentView.frame = cFrame;
}

スタック オーバーフローに関する質問に回答するのはこれが初めてです。私の回答が役に立った場合は、左側の灰色の上向き矢印をクリックしてください。

于 2013-03-22T16:29:53.123 に答える