2011-07-22 31 views

答えて

12

UITextFieldアプローチは、おそらくUISearchBarオブジェクトのリビルドのためには機能していません。 UITextFieldがスクリーン上に提示されると、UITextFieldのサイズが変更され、UITextField上のすべての操作が無効になります。

しかし、私はUISearchBarがsetContentInset:メソッド(iOS 5.0.1でテスト済み)に応答することを発見しました。囲みビューからの挿入距離を調整します。

この結果NSInvocationを含む洗練されたアプローチで:

if([aSearchBar respondsToSelector:@selector(setContentInset:)]) 
{ 
    SEL aSelector = NSSelectorFromString(@"setContentInset:"); 
    NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[aSearchBar methodSignatureForSelector:aSelector]]; 

    [inv setSelector:aSelector]; 
    [inv setTarget:aSearchBar]; 
    UIEdgeInsets anInsets = UIEdgeInsetsMake(5, 0, 5, 35); 
    [inv setArgument:&anInsets atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation 
    [inv invoke]; 
} 

上記のコードはCGRectを使用UISearchBar(有効UITextFieldの)のcontentInsetのサイズを変更は、anInsetsパラメータで示さ。親if文(respondsToSelector:)は、新しいバージョンのiOSでこの動作が変更されないようにします。

はSwift3とiOS10のための更新:

if searchBar.responds(to: Selector("setContentInset:")) { 
    let aSelector = Selector("setContentInset:") 
    let anInset = UIEdgeInsetsMake(5, 0, 5, 35) 
    searchBar.perform(aSelector, with: anInset) 
} 
+1

魅力のように動作します。たとえば、スペースを左右に使用する場合は、上記のように使用してください: 'UIEdgeInsets anInsets = UIEdgeInsetsMake(5,50/* left * /、5、50/* right * /);' – ecotax

+0

上部と下部のインセットを0として、デフォルトのインセットを適用します。 5に設定しますが、検索バーの上に移動する原因となったテキストフィールドを選択したときに発生しました。 – Jonah

+0

このコードはあなたのアプリをAppStoreから拒否しますか?それ以外は、実際には、魅力のように動作します –

関連する問題