2014-01-07 8 views
11

firstResponderになったときと拒否したときに奇妙な振る舞いをする検索バーに問題があります。UISearchBarは自動的にフレームのサイズを変更してフレームを変更します

検索バーは、テーブルビュー

self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.view.frame.size.width, 44.0f)]; 
self.searchBar.translucent = NO; 
self.searchBar.barTintColor = [UIColor grayColor]; 
self.tableView.tableHeaderView = self.searchBar; 

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar 
                  contentsController:self]; 
self.searchController.searchResultsDataSource = self; 

のヘッダとして付加されているビューコントローラはJASidePanelControllerの左パネルに設定され、キーボードが表示または非表示にするときには、中央パネルを非表示:

- (void)keyboardWillAppear:(NSNotification *)note 
{ 
    [self.sidePanelController setCenterPanelHidden:YES 
              animated:YES 
              duration:[[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; 
    self.searchBar.showsCancelButton = YES; 
} 

- (void)keyboardWillDisappear:(NSNotification *)note 
{ 
    [self.sidePanelController setCenterPanelHidden:NO 
              animated:YES 
              duration:[[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; 
    self.searchBar.showsCancelButton = NO; 
} 

ノーマル状態 Normal state

検索バーがなりポイント最大約それのいずれかまたは下に移動しポイントをランダム

Point down



Point upそして、検索バーは、その自然のフレームに戻し、その後、ウィンドウの原点に到達するまでアニメーション化し、辞職すると

Stretching up

Reaching origin

ここにはバグを再現するsample projectがあります。

EDIT:

@kwylezsuggestion 1として、それは辞任時に検索バーが作る、不要なアニメーションをすることで回避することができます。

self.searchBar.clipsToBounds = YES; 
+0

それがするtableHeaderである必要はありません場合にtableViewのするtableHeaderは、アップ/ダウンの動きを固定してのViewControllerのビューのサブビューとしてあなたの検索バーを追加し、代わりに。 –

+0

これは当てはまりますが、ユーザーがスクロールしたときに表示する必要のあるテーブルビューの背後にあるコンテンツがあります。何も見つからない場合でも解決策に戻る可能性があります。 – Moxy

+0

私の答えを確認してください – codercat

答えて

-1

私が機能「_layoutSidePanels」に問題をトレースしJASidePanelController。

あなたのアプリケーションデリゲートでは、次のコードをコメントアウトしています。グレイビューの拡大と縮小を修正しているようです。

rootViewController.shouldResizeLeftPanel = YES; 

あなたを介して、コードをたどる場合は検索バーが選択されている場合、あなたは以下のコードを実行し、その後_layoutSidePanelsを呼び出すsetCenterPanelHiddenを、呼び出し:

if (self.leftPanel.isViewLoaded) { 
    CGRect frame = self.leftPanelContainer.bounds; 
    if (self.shouldResizeLeftPanel) { 
     frame.size.width = self.leftVisibleWidth; 
    } 
    self.leftPanel.view.frame = frame; 
} 

サイドパネルのフレームを変更するには、のようです原因と私はコードをコメントアウトして私の最後に問題を修正すると述べた。

編集:最初は、検索バーがポイントを上下に移動しているように見えましたが、それ以上の検査では常にナビゲーションバーのわずかに下に表示されますが、検索バーと残りのビュー "グレー"が表示されるので、青いナビゲーションバーと明るいグレーの検索バーの間の白い部分は、以下のテーブルビューの残りの部分と同様に濃いグレーになります。

編集#2:私はしばらく時間をとったが、灰色のマスクがどこから来ていたかを把握することができた。あなたのUISearchDisplayControllerは検索バーがファーストレスポンダになったときに表示される灰色の背景に責任があるものです、と私は次の2つのコード行を削除したときに見ていた問題が去っていきました:これを行う

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self]; 
self.searchController.searchResultsDataSource = self; 

だけにしました問題の原因を示しますが、これらのコード行を削除すると、検索ディスプレイコントローラを使用して得ようとしている機能を無効にします。私はあなたが何を望んでいるのか正確にはわからないので、どのように進むべきかアドバイスは本当にありませんが、原因について正しい方向に指摘してくれたらうれしいです!

+1

あなたが述べた問題は、アップルのサンプルコードでもこのバグを持つ 'UISearchDisplayController'です。 JASidePanelsのアニメーション「競合」は、境界にクリップすることで解決されます。 – Moxy

+0

私の答えがまったく助けてくれれば、それを承認することは大変に感謝しています! :) – Mike

+0

あなたの答えは、問題がどこにあるのかを指摘していますが、解決していません。あなたが答えた(私の編集をチェックする)前に、私は限界を決めるクリップを持っていました。あなたがそれを変更して問題を解決すれば、私はあなたのことを承認してくれるだけではないでしょう:) – Moxy

0

検索バーと、検索対象のデータを管理するビューコントローラを使用して、検索表示コントローラを初期化します。ユーザが検索を開始すると、検索表示コントローラは、元の表示コントローラのビューに検索インタフェースを重ね合わせ、検索結果をテーブルビューに表示します。

Fixed - UISearchBar-bug-master

+0

色だけを変更しました(私は何かが欠けていないことを願っています)。ギャップは、まだ – Moxy

+0

と入力する前にテーブルビューの背景を(2回に1回)表示します。 Apple doc – codercat

+1

を読んでください。私は知っていますが、そのギャップを残してはいけません。それはiOS 6ではありません。「UISearchDisplayController」にはiOS 7に多くのバグがありますが、それを使う必要があります。私はこの場合の動作を変更するソリューションを探しています。私は努力に感謝し、答えを受け入れること(また、もう一つの賞金を賞賛することさえ可能です)が、このケースでは問題が解決しないと述べています。 – Moxy

7

あなたの検索バーの表示をカスタマイズし

私はYESにClipBoundsセットでのUIViewを作成することで、この問題を解決して、その中にサブビュー検索バーを追加します。 それから、それをtableviewヘッダーに含めます。今働いている。

おかげ

関連する問題