14

多くのボタンを含む長いビューを含む単純なビューがあり、全体がUIScrollView. はscrollerうまく機能scrollし、一番下にある をクリックすることができますbutton。Everybuttonはモーダルseque toanotherをトリガーしますview。その新しいviewものはユーザーの操作によって閉じられ、元のものUIScrollView's viewが再度読み込まれます。

ここに問題があります。 の上部にあるボタンをクリックするとUIScrollView、 modal に入り、seguenew を閉じて、問題なくviewに戻りUIScrollView's viewます。しかし、 の下部にあるボタンの 1 つをクリックすると、元UIScrollViewに戻っsequeてから元に戻ると、スクロールがすべて台無しになります。の下の領域しか見えず、もう上に戻るscrollerことはできません!scroll

UIScrollView'sの開始点と終了点をリセットする方法があるはずですが、わかりViewWillAppearません。どんな助けでも大歓迎です!

また、参考までに、スルー インターフェイス ビルダーを追加しただけで、UIScrollViewまだどこにも実装または合成していません。

4

6 に答える 6

30

このコードを試してください:

- (void)viewWillAppear:(BOOL)animated
{
  [yourscrollview setContentOffset:CGPointZero animated:YES];
}
于 2013-06-06T04:53:59.683 に答える
4

注意: この質問と回答に関するバグは、iOS 7 で修正されたようです。この回答の残りの部分は、iOS 6 (およびおそらくそれ以前) にのみ関連しています。

ここで示されている動作は、UIScrollViewクラスのバグです。UIViewControllerOPで指摘されているように、モーダルに表示されたから を含むシーンに戻った後、UIScrollViewUIScrollView現在スクロールされているポイントを取得し、それが原点であるかのように動作し始めます。つまり、別のビュー コントローラーをモーダルに表示する前にスクロール ビューを下にスクロールした場合、スクロール ビューでシーンに戻ったときに上にスクロールすることはできません。

ウィンドウを変更しなくても、スクロール ビューをビュー階層から削除して再度追加すると、同じことが起こります。

これを回避するには、モーダル ビュー コントローラーを閉じた後contentOffset、スクロール ビューが再び表示される前に設定を戻します。{0,0}ユーザーがモーダルをトリガーする前にスクロールしたポイントを実際に保持したい場合は、が再表示された、リセットする前の状態に戻すことができます。UIScrollViewcontentOffset

UIScrollViewモーダルから戻るたびにスクロール ビューを一番上にリセットせずにバグを修正するサブクラスを次に示します。

@interface NonBuggedScrollView : UIScrollView

@end

@implementation NonBuggedScrollView {
    CGPoint oldOffset;
}

-(void)willMoveToWindow:(UIWindow *)newWindow {
    oldOffset = self.contentOffset;
    self.contentOffset = CGPointMake(0,0);
}

-(void)willMoveToSuperview:(UIView *)newSuperview {
    oldOffset = self.contentOffset;
    self.contentOffset = CGPointMake(0,0);
}

-(void)didMoveToWindow {
    self.contentOffset = oldOffset;
}

-(void)didMoveToSuperview {
    self.contentOffset = oldOffset;
}

@end

サブクラスではなく でこれを行いたい場合は、 メソッドと メソッドでコンテンツ オフセットをUIViewController変更します。UIScrollViewviewWillAppear:viewDidAppear

OPが要求したように、モーダルから戻ったときにユーザーのスクロール位置を保持したくない場合、UIScrollView必要なのはさらに簡単です:

@interface NonBuggedScrollView : UIScrollView

@end

@implementation NonBuggedScrollView

-(void)willMoveToWindow:(UIWindow *)newWindow {
    self.contentOffset = CGPointMake(0,0);
}

-(void)willMoveToSuperview:(UIView *)newSuperview {
    self.contentOffset = CGPointMake(0,0);
}


@end
于 2013-08-24T16:30:18.940 に答える
2

この問題を解決するには、次のコードを使用します。

-(void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    [self.scrollview scrollRectToVisible:CGRectMake(0, 0, 1, 1)
                                animated:NO];   
}
于 2013-10-07T03:14:16.000 に答える
0

scrollRectToVisible:animated:を呼び出すことで、開始点と終了点を変更できます。しかし、これで問題が解決するかどうかはわかりません。

于 2013-06-06T04:43:52.747 に答える