12

バナーの下部に 50 ピクセルを許可しているため、アプリのテーブル ビューは画面全体の高さを占有しません。

検索バーに入力し始めると、検索結果のテーブル ビューが大きくなります。検索バーとタブ バーの間のすべての使用可能な画面スペースを埋めます。これは、最後の検索結果がバナーによって隠されていることを意味します。

UISearchDisplayController で使用されるテーブル ビューのサイズを指定するにはどうすればよいですか? 私が見ることができる境界やフレームのプロパティはありません。

編集してスクリーンショットを追加:

これは、テーブル ビューが IB で設定される方法です。合成されたタブ バーの 50px 手前で終了します。

代替テキスト
(出典: lightwood.net )

これは、コンテンツが正常に表示される方法です。ここの一番下までスクロールしました。 (出典: lightwood.net )代替テキスト

検索するとこのように表示されます。繰り返しますが、一番下までスクロールしました。バナー広告を無効にすると、検索表示テーブルがタブバーまで広がっていることがわかります。

代替テキスト
(出典: lightwood.net )

4

3 に答える 3

51

これを解決するための鍵は、テーブルビューのジオメトリをいつ変更するかを見つけることでした。呼び出し:

[self.searchDisplayController.searchResultsTableView setFrame:someframe];

UISearchDisplayControllerを作成した後は無駄でした。答えはこのデリゲートメソッドでした:

-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {
    tableView.frame = someframe;
}

注意してください、私も試し-searchDisplayController:didLoadSearchResultsTableViewましたが、そこではうまくいきませんでした。サイズを変更するには、表示されるまで待つ必要があります。

また、を割り当てるだけtableView.frame = otherTableView.frameでは、検索結果テーブルが対応する検索バーと重なるため、検索をクリアまたはキャンセルすることはできません。

私の最終的なコードは次のようになりました:

-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {

    CGRect f = self.masterTableView.frame;  // The tableView the search replaces
    CGRect s = self.searchDisplayController.searchBar.frame;
    CGRect newFrame = CGRectMake(f.origin.x,
                                 f.origin.y + s.size.height,
                                 f.size.width,
                                 f.size.height - s.size.height);

    tableView.frame = newFrame;
}
于 2010-03-07T01:20:58.470 に答える
1

より深いビュー階層を可能にするためにコードを更新しましたが、半透明のカバー ビューの最初のフレームは依然として検索バーの下のウィンドウ全体を占めています。

-(void)searchDisplayController: (UISearchDisplayController*)controller 
 didShowSearchResultsTableView: (UITableView*)tableView 
{
    if ( [controller.searchBar.superview isKindOfClass: [UITableView class]] )
    {
        UITableView* staticTableView = (UITableView*)controller.searchBar.superview;

        CGRect f = [tableView.superview convertRect: staticTableView.frame fromView: staticTableView.superview];
        CGRect s = controller.searchBar.frame;
        CGRect newFrame = CGRectMake(f.origin.x,
                                     f.origin.y + s.size.height,
                                     f.size.width,
                                     f.size.height - s.size.height);

        tableView.frame = newFrame;
    }
}
于 2011-02-22T16:53:47.507 に答える
0

あなたが説明していることを完全に理解しているかどうかはわかりません。スクリーンショットがあるといいでしょう。

UITableView が画面のサイズであり、バナーがその下の 50 ピクセルに重なっているように聞こえます。すべての UIView の子には、共通の UIView の親から継承するフレーム、境界、および中心のプロパティがあります。

@interface UIView(UIViewGeometry)

// animatable. do not use frame if view is transformed since it will not correctly reflect the actual location of the view. use bounds + center instead.
@property(nonatomic) CGRect            frame;

// use bounds/center and not frame if non-identity transform. if bounds dimension is odd, center may be have fractional part
@property(nonatomic) CGRect            bounds;      // default bounds is zero origin, frame size. animatable
@property(nonatomic) CGPoint           center;      // center is center of frame. animatable
@property(nonatomic) CGAffineTransform transform;   // default is CGAffineTransformIdentity. animatable
// ... from UIView.h

これらのプロパティは好きなように操作できます。境界を画面より 50 ピクセル小さく調整し、計算を行って新しい中心を計算するだけでよいようです。

于 2010-03-05T18:33:58.607 に答える