2

アプリのルート以外の場所にある UISplitViewController に相当するものを必要とする設計があります。それはなんらかのばかげた理由で (Apple に感謝します) 違法であるため、その特定の側面を手作業で書き直さなければなりませんでした。

テーブルはランドスケープ モードでは適切にレイアウトされますが、ポップオーバーに移動すると、奇妙な問題が発生します。もともと、キーボード用のスペースを確保するためにポップオーバーを縮小するのに十分な長さのポップオーバーがあったため、TableView が大きすぎて切り取られてしまいました。だから私はポップオーバーを縮小しました...そして今、データをリロードするとTableViewは縮小しています(ユーザーが検索キーを入力するときに行う必要があります)。エラーは、tableView を reloadData したにのみ表示されることに注意してください。クリッピングの代わりに、上部と下部で「バンド ボクシング」が縮小されるようになりました。

フレームデータに対してクエリを実行すると、tableView が奇妙に表示され、高さが維持されます。それが何を意味するのか、私にはわかりません。ポップオーバーを閉じて表示しても問題は解決しませんが (ポップオーバーが大きくなってしまうと思いますか?)、キーボードを思い出すと問題は解決します (ポップオーバーは正しい高さに縮小します)。(積極的に入力しているユーザーにとっては面倒なので、修正として試したくありません)。

編集:

重要な場合、私が適用した唯一の自動レイアウトは UITableView です。幅と高さが固定されています。スーパービューを参照しようとするとエラーが発生することを除いて、間違いだった可能性のある X または Y データはありません。

編集:要求されたコード(申し訳ありませんが、これは非常に大きくて醜いブロックです):

-(void)setupViewsAfterRotation
{
    if (UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)) {
        [self.searchTable.view removeFromSuperview];
        self.popover=[[UIPopoverController alloc] initWithContentViewController:self.searchTable];
        self.navigationItem.leftItemsSupplementBackButton=YES;
        self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"Search"
                                                                               style:UIBarButtonItemStylePlain
                                                                              target:self
                                                                              action:@selector(presentPopover)];
        [self setupPortraitConstraints];
        //NSLog(@"Intrinsic size data:  width: %f and height: %f",self.searchTable.view.intrinsicContentSize.width, self.searchTable.view.intrinsicContentSize.height);
        //NSLog(@"Runtime size data:  width: %f and height: %f",self.searchTable.view.frame.size.width, self.searchTable.view.frame.size.height);

    } else {
        [self.popover dismissPopoverAnimated:NO];
        self.popover=nil;
        self.navigationItem.leftBarButtonItem=nil;
        [self.view addSubview:self.searchTable.view];
        [self setupLandscapeConstraints];
    }
}

-(void)setupLandscapeConstraints
{
    if (self.tableViewConstraints) {
        [self.view removeConstraints:self.tableViewConstraints];
        self.tableViewConstraints=nil;
    }
    NSMutableArray *landscapeConstraints=[[NSLayoutConstraint constraintsWithVisualFormat:@"|[tableView(==256)]"
                                                                                  options:0
                                                                                  metrics:nil
                                                                                    views:@{@"tableView": self.searchTable.view}] mutableCopy];

    [landscapeConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topLayoutGuide][tableView]|"
                                                                                      options:0
                                                                                      metrics:nil
                                                                                        views:@{@"tableView": self.searchTable.view,
                                                                                                @"topLayoutGuide":[self topLayoutGuide]
                                                                                                }]];
    self.tableViewConstraints=landscapeConstraints;
    [self.view addConstraints:self.tableViewConstraints];
}

-(void)setupPortraitConstraints
{
    if (self.tableViewConstraints) {
        [self.view removeConstraints:self.tableViewConstraints];
        self.tableViewConstraints=nil;
    }
    NSMutableArray *portraitConstraints;
    if (self.keyboardHeight) {
        NSLog(@"Height set to 612");
        portraitConstraints=[[NSLayoutConstraint constraintsWithVisualFormat:@"V:[tableView(==612)]"
                                                                     options:0
                                                                     metrics:nil
                                                                       views:@{@"tableView": self.searchTable.view}] mutableCopy];
        [self.popover setPopoverContentSize:CGSizeMake(256, 612) animated:YES];
    }
    else{
        NSLog(@"Height set to 768");
        portraitConstraints=[[NSLayoutConstraint constraintsWithVisualFormat:@"V:[tableView(==768)]"
                                                                     options:0
                                                                     metrics:nil
                                                                       views:@{@"tableView": self.searchTable.view}] mutableCopy];
        [self.popover setPopoverContentSize:CGSizeMake(256, 768) animated:YES];
    }

    [portraitConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"[tableView(==256)]"
                                                                                     options:0
                                                                                     metrics:nil
                                                                                       views:@{@"tableView": self.searchTable.view}]];
    self.tableViewConstraints=portraitConstraints;
    [self.searchTable.view addConstraints:self.tableViewConstraints];
}
4

1 に答える 1

2

ポップオーバーのコンテンツ サイズを設定して、ポップオーバーの表示領域を制限します。

これは、次の方法で行うことができます。

  1. メソッド setPopoverContentSize: を使用して、ポップオーバーのコンテンツ サイズを設定します。
  2. コンテンツ ビュー コントローラーの contentSizeForViewInPopover を設定します。

Appleのドキュメントから:

ポップオーバーは通常、表示するビュー コントローラーからサイズを取得します。ただし、popoverContentSize プロパティの値を変更するか、setPopoverContentSize:animated: メソッドを呼び出すことで、ポップオーバーのサイズを変更できます。後者のアプローチは、ポップオーバーのサイズの変更をアニメーション化する必要がある場合に特に効果的です。指定したサイズは、ポップオーバーのビューに適したサイズです。実際のサイズは、ポップオーバーが画面に収まり、キーボードと衝突しないように変更される場合があります。

popoverContentSize プロパティに関するApple のドキュメントから:

このプロパティの値を変更すると、現在のビュー コントローラーのデフォルト値がオーバーライドされます。オーバーライドされた値は、新しいコンテンツ ビュー コントローラーをレシーバーに割り当てるまで保持されます。したがって、オーバーライドされた値を保持したい場合は、コンテンツ ビュー コントローラーを変更した後に再割り当てする必要があります。

于 2013-09-18T04:29:39.763 に答える