it-swarm.com.ru

UITextField в UISearchBar в iOS 7

Я пытаюсь добиться того же внешнего вида моего UISearchBar с TextField внутри него, как в моем приложении iOS 6. Я пытался закодировать его несколькими способами, но пока не увенчался успехом. Проблема в том, что я не могу изменить фрейм TextField с iOS 7. В результате, мой TextField занимает все пространство в NavigationBar и переопределяет UIBarButtonItem (кнопка меню) вправо. Смотрите фотографии ниже: 

Скриншоты http://oi44.tinypic.com/2ufewx0.jpg

iOS 6 code: _ ​​Вот как я кодировал его в iOS 6, где я мог установить рамку TextFields на то, что мне понравилось!

UITextField *sbTextField = (UITextField *)[searchBar.subviews lastObject];
[sbTextField removeFromSuperview];

CGRect rect = searchBar.frame;
rect.size.height = 32;
rect.size.width = 210;
sbTextField.frame = rect;

[sbTextField setAutoresizingMask:UIViewAutoresizingFlexibleBottomMargin];


UIBarButtonItem *searchBarNavigationItem = [[UIBarButtonItem alloc]  initWithCustomView:sbTextField];

[[self navigationItem] setLeftBarButtonItem:searchBarNavigationItem];

Результат из кода выше в iOS 7:! [IOS 7 look]

iOS 7 code: _ ​​Разница в iOS 7 заключается в том, что вам нужно использовать подпункты для добавления UITextField в UISearchBar/UINavigationBar. Делая это, я еще не был в состоянии изменить свой кадр. В настоящее время он перекрывает кнопку меню справа, что можно увидеть на рисунке ниже этого кода ...

UITextField* sbTextField;
CGRect rect = subView.frame;
rect.size.height = 32;
rect.size.width = 115;

for (UIView *subView in self.searchBar.subviews){
    for (UIView *ndLeveSubView in subView.subviews){

        if ([ndLeveSubView isKindOfClass:[UITextField class]])
        {

            sbTextField = (UITextField *)ndLeveSubView;
            sbTextField.backgroundColor =[UIColor whiteColor];
            UIBarButtonItem *searchBarNavigationItem = [[UIBarButtonItem alloc] initWithCustomView:sbTextField];
            sbTextField.frame = rect;
            self.navigationItem.leftBarButtonItem = searchBarNavigationItem;
            self.navigationItem.rightBarButtonItem =  menuButton;
            [sbTextField removeFromSuperview];

             break;
        }

    }

 }
 [self.searchBar reloadInputViews];

enter image description here SO ... Можно ли каким-либо образом изменить фрейм подпредставления (TextField)? :(

ПРАВКА

Ответ довольно неубедительный. Чтобы заставить код работать в ios7 с кнопкой справа от TextField, TextField должен быть установлен как titleView панели навигации. Что не было в ios 6. Но будут другие глюки, и не рекомендуется использовать TextField в пределах панели поиска в iOS 7. Вместо этого используйте searchDispalyController. См. мой ответ ниже

 self.navigationItem.titleView = sbTextField;
12
user1293618

Вы не должны помещать UITextField в UINavigationBar в iOS 7, этот виджет уже предоставлен Apple.

В iOS 7 вы можете просто использовать UISearchDisplayController с UISearchBar и установить:

searchDisplayController.displaySearchBarInNavigationBar = YES

Панель поиска появится в вашем UINavigationBar, и она будет проигрывать Nice вместе с другими UIBarButtonItems без всех хаков и ручного изменения размера кадра в вашем исходном решении iOS 6.

Стоит отметить одну вещь: если вы собираетесь добавить это в проект, который по-прежнему поддерживает операционные системы, более старые, чем iOS 7, вам нужно убедиться, что вы установили проверку вызова, иначе ваше приложение будет аварийно завершаться при работе на старых операционных системах.

if([searchDisplayController respondsToSelector:@selector(displaysSearchBarInNavigationBar)])
{
    searchDisplayController.displaysSearchBarInNavigationBar = YES;
}

См. Этот раздел руководства по переходу с iOS 7: https://developer.Apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/Bars.html

В iOS 7 UISearchDisplayController включает в себя отображает свойствоSearchBarInNavigationBar, которое можно использовать для добавления панель поиска в панели навигации, аналогичная той, что в календаре на iPhone:

Еще одно замечание - вы должны рассмотреть возможность перехода к AutoLayout в будущем, чтобы вам не приходилось делать все эти утомительные манипуляции с кадрами. Apple рекомендует это, и, вероятно, не зря (будущие устройства с большими экранами ...?)

13
DiscDev

в iOS 7 для доступа к текстовому полю вы должны повторить на уровне больше. Измените свой код следующим образом

for (UIView *subView in self.searchBar.subviews){
    for (UIView *ndLeveSubView in subView.subviews){
    if ([ndLeveSubView isKindOfClass:[UITextField class]])
        {
            searchBarTextField = (UITextField *)ndLeveSubView;
            break;
        }
    }
   }

Но лучший способ очистить фон UISearchBar и установить значок панели поиска в текстовом поле:

[searchBar setBackgroundImage:[[UIImage alloc] init] ];//if you want to remove background of uisearchbar
UIImage *image = [UIImage imageNamed: @"search_icon.png"];
[searchBar setImage:image forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];
13
Adnan Aftab

Попробуйте это, я не уверен, но это должно работать, так как в iOS 7 панель поиска имеет подпредставление, и внутри этого подпредставления есть два подпредставления, одно из которых UITextField

UIView *searchbarview = [searchBar.subviews objectAtIndex:0];
UITextField *sbTextField = (UITextField *)[searchbarview.subviews lastObject];
[sbTextField removeFromSuperview];

CGRect rect = searchBar.frame;
rect.size.height = 32;
rect.size.width = 210;
sbTextField.frame = rect;

[sbTextField setAutoresizingMask:UIViewAutoresizingFlexibleBottomMargin];


UIBarButtonItem *searchBarNavigationItem = [[UIBarButtonItem alloc] initWithCustomView:sbTextField];

[[self navigationItem] setLeftBarButtonItem:searchBarNavigationItem];
2
Bhumit Mehta

Создайте UIView * textFieldContainer с целевым фреймом, добавьте текстовое поле в этот UIView, а затем добавьте этот textFieldContainer в качестве элемента навигации. т. е. ваш подход остается прежним, только текстовое поле находится внутри контейнера, и вы играете с этим контейнером.

2
Syed Absar

iOS6 и iOS7-совместимое решение:

- (void)setTextFieldAsDelegate:(UIView *)inputView {
    for (UIView *view in inputView.subviews) {
        if ([view isKindOfClass:[UITextField class]]) {
            searchBarTextField = (UITextField *)view;
            searchBarTextField.delegate = self;
            break;
        } else {
            [self setTextFieldAsDelegate:view];
        }
    }
}
2
Javier Querol

Быстрое решение

for subView in searchBar.subviews{
        for deeperView in subView.subviews{
            if let searchField:UITextField = deeperView as? UITextField{
                searchField.layer.borderWidth = 1.0
                searchField.layer.borderColor = UIColor(red: 134/255, green: 14/255, blue: 75/255, alpha: 1).CGColor
                searchField.layer.cornerRadius = 5.0
            }
        }
    }
0
Tialtous