41

navigationController:にプッシュされる直前に、詳細ビューコントローラの状態を調整しています。

[self.detailViewController detailsForObject:someObject];
[self.navigationController pushViewController:self.detailViewController
                                     animated:YES];

DetailViewControllerscrollViewにはがあります。渡されたオブジェクトに基づいてサイズを変更するコンテンツ:

- (void)detailsForObject:(id)someObject {
    // set some textView's content here
    self.contentView.frame = <rect with new calculated size>;

    self.scrollView.contentSize = self.contentView.frame.size;
    self.scrollView.contentOffset = CGPointZero;
}

これですべて機能しますが、scrollViewcontentOffsetはnavigationControllerのスライドインアニメーション中に調整します。最後のcontentOffsetcontentSizeと新しく計算されたcontentSizeの差に設定されます。これは、detailsViewを2回目に開いたときに、詳細が不要な場所にスクロールすることを意味します。contentOffsetCGPointZero明示的に設定しているのに。

contentOffsetinをリセットし- viewWillAppearても効果がないことがわかりました。私が思いついた最善の方法は、contentOffsetをリセットしてviewDidAppear、コンテンツの上下の動きを目立たせることです。

- (void)viewDidAppear:(BOOL)animated {
    self.scrollView.contentOffset = CGPointZero;
}

変更時にUIScrollView調整されないようにする方法はありますか?contentOffsetcontentSize

4

8 に答える 8

63

を使用してUIViewController含むをプッシュするときに発生します。UIScrollViewUINavigationController

iOS11以降

解決策1(Swiftコード):

scrollView.contentInsetAdjustmentBehavior = .never

ソリューション2(ストーリーボード)

ここに画像の説明を入力してください

iOS 7

解決策1(コード)

に設定@property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsetsNOます。

ソリューション2(ストーリーボード)

チェックを外しますAdjust Scroll View Insets

スクロールビューのインセットを調整する

iOS 6

ソリューション(コード)

UIScrollViewのプロパティcontentOffsetとを設定contentInsetviewWillLayoutSubviewsます。サンプルコード:

- (void)viewWillLayoutSubviews{
  [super viewWillLayoutSubviews];
  self.scrollView.contentOffset = CGPointZero;
  self.scrollView.contentInset = UIEdgeInsetsZero;
}
于 2013-12-02T10:07:53.657 に答える
15

私は解決策を見つけましたが、この問題の原因は不明なままです。コンテンツのサイズとオフセットを調整する前にリセットすると、UIScrollViewはアニメーション化されません。

- (void)detailsForObject:(id)someObject {
    // These 2 lines solve the issue:
    self.scrollView.contentSize = CGSizeZero;
    self.scrollView.contentOffset = CGPointZero;

    // set some textView's content here
    self.contentView.frame = <rect with new calculated size>;

    self.scrollView.contentSize = self.contentView.frame.size;
    self.scrollView.contentOffset = CGPointZero;
}
于 2011-07-11T13:45:41.833 に答える
3

UIScrollviewでも同じ問題が発生しました。この問題は、contentSizeを設定しないことが原因で発生しました。contentSizeをアイテムの数に設定した後、この問題は解決されました。

self.headerScrollView.mainScrollview.contentSize = CGSizeMake(320 * self.sortedMaterial.count, 0);
于 2013-09-23T13:29:19.217 に答える
3

ストーリーボードのscrollView
のサイズインスペクターで、[コンテンツインセットの調整動作]を[しない]に設定します。

ここに画像の説明を入力してください

于 2018-07-13T20:54:52.017 に答える
0

scrollViewはDetailViewControllerのルートビューですか?はいの場合は、scrollViewをプレーンでラップしUIViewて、後者をDetailViewControllerのルートビューにしてみてください。にはプロパティUIViewがないため、ナビゲーションコントローラーによって行われるコンテンツオフセットの調整(ナビゲーションバーなどによる)の影響を受けません。contentOffset

于 2011-06-29T16:21:38.900 に答える
0

私は問題を経験しました、そして特定のケースのために-私はサイズを調整しません-私は以下を使用しました:

float position = 100.0;//for example

SmallScroll.center = CGPointMake(position + SmallScroll.frame.size.width / 2.0, SmallScroll.center.y);

同じことがyでも機能します:anotherPosition + SmallScroll.frame.size.height / 2.0

したがって、サイズを変更する必要がない場合、これは迅速で痛みのないソリューションです。

于 2012-08-16T13:29:25.127 に答える
0

UIKitがプッシュアニメーション中にscrollViewのcontentOffsetを設定していたという同様の問題が発生していました。

iOS10とiOS11をサポートしていたためか、これらのソリューションはどれも機能しませんでした。

スクロールビューがウィンドウから削除された後、UIKitがオフセットを変更しないようにスクロールビューをサブクラス化することで、問題を修正することができました。

/// A Scrollview that only allows the contentOffset to change while it is in the window hierarchy. This can keep UIKit from resetting the `contentOffset` during transitions, etc.
class LockingScrollView: UIScrollView {
    override var contentOffset: CGPoint {
        get {
            return super.contentOffset
        }
        set {
            if window != nil {
                super.contentOffset = newValue
            }
        }
    }
}
于 2018-07-17T18:52:34.933 に答える
0

KarenAnneの答えに追加:

iOS11以降

automaticallyAdjustsScrollViewInsetsは非推奨になりました

この代わりに使用してください:

ストーリーボード:

ここに画像の説明を入力してください

コード(Swift):

scrollView.contentInsetAdjustmentBehavior = .never
于 2021-05-24T15:27:55.377 に答える