Подход UITextField больше не работает, возможно, из-за рестайлинга объекта UISearchBar.UISearchBar изменяет размер своего 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];
}
Приведенный выше код изменяет размер contentInset
UISearchBar (фактически UITextField), используяCGRect указывается в параметре 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)
}