60

更新 2

4 インチのデバイスを使用して、iOS シミュレーターでアプリを実行およびテストしています。3.5 インチのデバイスを使用して実行すると、ラベルがジャンプしません。私の .xib では、Simulated Metrics の下で、Retina 4 インチ フルスクリーンとして設定しています。この問題が 4 インチのデバイスでしか発生しない理由がわかりませんか?

更新 1

IB で、Simulated Metrics で「Navigation Bar」を選択すると、ラベルがまだジャンプします。最初の画面でラベルを正しくレンダリングする唯一の方法は、ナビゲーション コントローラーをウィンドウのルート ビュー コントローラーとして設定しないことです。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

私のウィンドウの rootViewController は、rootViewController に UIPageViewController が埋め込まれている UINavigationController に設定されています。

私のアプリが読み込まれると、最初のビューはコンテンツが少し押し下げられた状態で表示され、ナビゲーション バーとほぼ同じサイズになります。pageViewController をスクロールすると、コンテンツはペン先に配置された場所にジャンプし、pageViewController によってロードされた他のすべての viewController は問題ありません。

ナビゲーションコントローラー付きの uipageviewcontroller

私のappDelegateでは:

self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[ContainerViewController new]];

ContainerViewController で:

- (void)viewDidLoad {

    [super viewDidLoad];

    self.pvc = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll
                                               navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal
                                                             options:nil];
    self.pvc.dataSource = self;
    self.pvc.delegate = self;
    DetailViewController *detail = [DetailViewController new];
    [self.pvc setViewControllers:@[detail]
                       direction:UIPageViewControllerNavigationDirectionForward
                        animated:false
                      completion:nil];

    [self addChildViewController:self.pvc];
    [self.view addSubview:self.pvc.view];
    [self.pvc didMoveToParentViewController:self];
}
4

15 に答える 15

83

そのため、さらなる開発の後に別の回答を追加していますが、最終的に何が起こっているのかがわかったと思います。iOS7 のように見えますが、UIPageViewController には独自の UIScrollView があります。automaticallyAdjustsScrollViewInsetsこのため、 falseに設定する必要があります。これが私のviewDidLoad今です:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.automaticallyAdjustsScrollViewInsets = false;

    DetailViewController *detail = [[DetailViewController alloc] init];
    [self setViewControllers:@[detail]
                   direction:UIPageViewControllerNavigationDirectionForward
                    animated:false
                  completion:nil];
}

何も入れる必要はありませんviewWillLayoutSubviews(私の以前の回答の1つが示唆したように)。

于 2013-11-14T21:50:28.160 に答える
12

Under Top Bars両方のチェックを外すだけです:UIPageViewControllerとカスタムPageContentViewController:

ここに画像の説明を入力

于 2015-08-03T22:41:25.070 に答える
4

私の最初の答えは当分の間問題を解決しましたが、しばらくすると同じ問題が戻ってきて私を悩ませました。

次の viewController 階層を使用します。

-- UINavigationController
  -- MyPageViewController
    -- MyDetailViewController

これを解決するために私がしたことは次のとおりです。

MyPageViewController.m 内

@interface MyPageViewController () <delegates>
  @property (strong) MyDetailViewController *initialViewController;
@end

- (void)viewDidLoad
{
    ...

    // set this once, because we're going to use it in viewWillLayoutSubviews,
    // which gets called multiple times
    self.initialViewController = [MyDetailViewController new];
}

// the problem seemed to stem from the fact that a pageViewController couldn't
// properly lay out it's child view controller initially if it contained a 
// scroll view. by the time we're in layoutSubviews, pageViewController seems to
// have gotten it's bearings and everything is laid out just fine.
- (void)viewWillLayoutSubviews
{
    [self setViewControllers:@[self.initialViewController]
                   direction:UIPageViewControllerNavigationDirectionForward
                    animated:false
                  completion:nil];
}
于 2013-09-27T21:11:27.103 に答える
3

私も同じ問題を抱えてる。UIPageViewControllerのインスタンスを作成するときに設定するのではなく、UIPageViewControllerのviewDidLoadの最初のページにsetViewControllersを配置することで解決します。また、automaticAdjustsScrollViewInsets を NO に設定する必要があります。

于 2015-03-25T19:17:43.090 に答える
1

ストーリーボードで PageViewController を選択し、属性インスペクターで「下のバーの下」と「不透明なバーの下」のチェックを外してみてください。

于 2015-07-31T06:34:19.523 に答える
0

「Bo:」で述べたように: MyPageViewController の viewDidLoad で問題を解決しました。– ボー

于 2015-03-02T09:34:11.947 に答える
0

最初に、私のView Controller階層は次のようになりました:

-- UINavigationController
  -- MyContainerViewController
    -- UIPageViewController
      -- MyDetailViewController

MyContainerViewController がツールバーを管理できるように、このように設定しました。私は問題を MyContainerViewController に絞り込みましたが、UIPageViewController をサブクラス化しても必要ないことに気付きました。今、私の階層は次のようになります。

-- UINavigationController
  -- MyPageViewController
    -- MyDetailViewController

MyPageViewControllerそれを管理toolbarし、4 インチと 3.5 インチのデバイスの両方で、すべてが期待どおりに動作します。

于 2013-08-14T16:09:55.347 に答える
0

iOS 9 で@Danny が説明したのと同じ問題が発生しています。すべての制約をマージンに制約されないように更新しようとしましたが、問題は解決しませんでした。次のように、これに似たハックを採用する必要がありました。

  • UIPageViewController に表示されるコンテンツ ページごとに、一番上の制約 (ビューの上部と上部レイアウト ガイドの下部の間の制約) を見つけ、そのアウトレットをビュー コントローラーに追加します。
  • このようなアウトレットを持つ各ビュー コントローラーで、優先される上部距離の別のプロパティを追加します。2 つのアウトレットは次のようになります (Swift の場合):

    @IBOutlet weak var topGuideConstraint: NSLayoutConstraint!
    var topDistance: CGFloat!
    
  • で、ストーリーボードの制約に割り当てられた値viewDidLoad()に設定します。topDistance

    override func viewDidLoad() {
        super.viewDidLoad()
        topDistance = topGuideConstraint.constant
    }
    
  • ではviewWillLayoutSubviews()、コンストレイントに適切な値が設定されていることを確認し、topLayoutGuide.lengthがゼロのときにステータス バーの高さを調整します。これはトランジション中の場合のようですが、コンストレイントが完了するとそうではありません。

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        topGuideConstraint.constant = topDistance + (
            topLayoutGuide.length == 0
                ? UIApplication.sharedApplication().statusBarFrame.size.height
                : 0
        )
    }
    

UIPageViewController に表示されるコンテンツ ビュー コントローラーごとに繰り返します。UINavigation バーも表示している場合は、必要に応じてオフセットを調整します。

これは不幸なハックであり、やらなければならないのは嫌ですが、何時間もさまざまなことを試した後、少なくとも何かがうまくいくので、先に進むことができてうれしく思います.

于 2016-08-08T17:51:42.787 に答える
0

djibouti33 の回答の Swift のバージョン (問題解決の一部ではない行を除く)

スイフト3.0

override func viewDidLoad() {
    super.viewDidLoad()
    self.automaticallyAdjustsScrollViewInsets = false
}
于 2017-06-11T08:07:52.737 に答える
0

スタック オーバーフローについて投稿するのはこれが初めてですが、この問題の解決策を 1 週間以上探しています。

これが私が思いついた解決策です。これが同じ問題を抱えている他の人にも役立つことを願っています.

詳細ビュー コントローラーのフレームをどのように初期化しているかはわかりませんが、使用する可能性があると仮定します: self.view.frame.size.height;

使用してみてください: self.view.frame.size.height -= self.navigationController.navigationBar.bounds.size.height;

お役に立てれば

于 2015-04-02T01:58:46.487 に答える