2011-07-22 32 views

Odpowiedz

12

Podejście UITextField przestało działać, prawdopodobnie z powodu restylacji obiektu UISearchBar. UISearchBar zmienia rozmiar swojego UITextField, gdy jest prezentowany na ekranie, to unieważnia wszystkie manipulacje na UITextField.

Jednak odkryłem, że UISearchBar reaguje na metodę setContentInset: (testowaną na iOS 5.0.1). Koryguje odległość wstawki od otaczającego widoku.

Wynik w zaawansowanych podejście obejmujące 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]; 
} 

Powyższy kod przeskalowanie contentInset z UISearchBar (w praktyce UITextField) stosując CGRect wskazany w parametrze anInsets. Nadrzędna instrukcja if (respondsToSelector:) ratuje się przed zmianami tego zachowania w nowych wersjach systemu iOS.

Aktualizacja dla Swift3 i iOS10:

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

Działa jak urok. Na przykład, aby mieć trochę miejsca w lewo i prawo, użyj powyższego z: 'UIEdgeInsets anInsets = UIEdgeInsetsMake (5, 50/* left * /, 5, 50/* right * /);' – ecotax

+0

Znalazłem, że jeśli opuścisz górne i dolne wypustki jako 0, stosuje domyślną wstawkę. Ustaw jako 5, ale stało się, gdy wybrałem pole tekstowe, które spowodowało jego przesunięcie na górę paska wyszukiwania. – Jonah

+0

Czy ten kod odrzuci twoją aplikację z AppStore? Poza tym, rzeczywiście działa jak urok. –

Powiązane problemy