3

UISearchBar を TopBar.m に次のように記述します。

_tempSearchBar =[[UISearchBar alloc]initWithFrame:CGRectMake(44, 0, 320 - 44, 43)];
_tempSearchBar.barStyle=UIBarStyleDefault;
_tempSearchBar.placeholder=@"搜索";
[self addSubview:_tempSearchBar];

結果はこのようになりました。 ここに画像の説明を入力

次に、別のクラスで UISearchDisplayController を次のように記述します。

_topBar.tempSearchBar.delegate = self;    
_searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:_topBar.tempSearchBar contentsController:self];
[_searchDisplayController setDelegate:self];
[_searchDisplayController setSearchResultsDataSource:self];

UISearchBarDelegate は次のようになります。

#pragma mark -
#pragma mark UISearchBarDelegate
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    [_searchDisplayController setActive:YES animated:YES];
}

UISearchBar をクリックすると、このように表示され、searchBar のフレームが変更されます。 ここに画像の説明を入力

UISearchDisplayController をキャンセルすると、次のようになります。 ここに画像の説明を入力

なぜフレームが変更されたのですか?幅は UISearchDisplayController によって 320-44 から 320 に変更されますか?
ありがとう。

4

4 に答える 4

12

UISearchDisplayController は、検索バーをそのスーパービューの幅に拡張します。私が見つけた最も簡単な解決策は、探している幅を持つ別の UIView 内に検索バーを配置することです。

于 2012-11-09T19:35:39.227 に答える
5

searchBar のフレームは UIKit によって変更されるため、searchBar のフレームを自分で変更しました。

以下のデリゲートで searchBar のフレームを変更しました。

1 つは UISearchBar のデリゲートです。

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
    [searchBar setFrame:CGRectMake(44, 0, 320 - 44, 43)];
}

もう 1 つは UISearchDisplayController のデリゲートです。

- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller{
    [controller.searchBar setFrame:CGRectMake(44, 0, 320 - 44, 43)];
    [self.searchDisplayController.searchResultsTableView setDelegate:self];
}

それは機能し、正しいフレームを取得できますが、検索バーをクリックすると少し揺れます。

これは最善の方法ではありませんが、うまくいく可能性があります。誰かがより良い方法を持っていますか?

更新: UISearchBar と UISearchDisplayController を数時間デバッグしましたが、小さなバグがあります: 編集を終了すると、searchBar の幅が 320px になり、その後自分の幅になります。cancelButton の背景色を変更できません。そこで、UISearchBar プロパティと UITableView プロパティを持つカスタム SearchDisplayController を作成しました。それは私にとってはうまくいきます。

于 2012-10-16T10:20:06.203 に答える
0

デリゲート メソッドを呼び出す

- (void) searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
{
    [controller.searchBar setFrame:CGRectMake(0,31, 320 , 43)];
    [self.searchDisplayController.searchResultsTableView setDelegate:self];
} 
于 2015-06-09T07:55:58.870 に答える
-1

- (void)setShowsCancelButton:animated:を使用して searchBar のキャンセル ボタンを処理できます。キャンセル ボタン を表示したくない場合 (キャンセル ボタンは searchBar のフレームを変更するため)、これをデリゲートに記述します。

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{   

    [searchBar setShowsCancelButton:NO animated:YES];
}

更新しました:

唯一可能な解決策は、SearchBar ビュー階層からキャンセル ボタンを見つけて非表示にすることです。

for (UIView *possibleButton in searchBar.subviews)
{
    if ([possibleButton isKindOfClass:[UIButton class]])
    {
        UIButton *cancelButton = (UIButton*)possibleButton;
        cancelButton.hidden = YES;
        break;
    }
}
于 2012-10-16T05:56:05.653 に答える