web-dev-qa-db-fra.com

UITextField dans UISearchBar sous iOS 7

J'essaie d'obtenir le même aspect de ma barre UISearchBar avec un champ de texte qu'il contient, comme dans mon application iOS 6. J'ai essayé de le coder de plusieurs façons et je n'ai pas encore réussi. Le problème est que je ne peux pas modifier le cadre de TextField de quelque manière que ce soit depuis iOS 7. Le résultat est que mon TextField occupe tout l'espace de la barre de navigation et remplace le UIBarButtonItem (bouton de menu) à droite. Voir les photos ci-dessous: 

Captures d'écran http://oi44.tinypic.com/2ufewx0.jpg

code iOS 6:} _ c'est comme cela que je l'ai codé dans iOS 6, où je pouvais définir le cadre TextFields sur ce que j'aimais!

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];

Le résultat du code ci-dessus sous iOS 7: ! [Look iOS 7]

code iOS 7:} _ La différence avec iOS 7 est que vous devez utiliser des sous-vues pour pouvoir ajouter UITextField à UISearchBar/UINavigationBar. Ce faisant, je ne encore pu changer de cadre, il chevauche actuellement le menuButton à droite que l’on peut voir dans l’image en dessous de ce code ... _

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 ... Est-il possible de changer le cadre d'une sous-vue (TextField) de quelque façon que ce soit? :(

EDIT

La réponse est un peu boiteuse. Pour que le code fonctionne dans ios7 avec un bouton à droite du TextField, le TextField doit être défini en tant que titleView de la barre de navigation. Ce qui n'était pas le cas dans iOS 6. Mais il y aura d'autres problèmes et il n'est pas recommandé d'utiliser TextField dans les barres de recherche de iOS7. Utilisez plutôt searchDispalyController. Voir ma réponse ci-dessous} _

 self.navigationItem.titleView = sbTextField;
12
user1293618

Vous ne devez pas placer UITextFielddans UINavigationBardans iOS 7, ce widget est déjà fourni par Apple.

Dans iOS 7, vous pouvez simplement utiliser un UISearchDisplayControlleravec un UISearchBaret définir:

searchDisplayController.displaySearchBarInNavigationBar = YES

La barre de recherche apparaîtra dans votre UINavigationBaret lira Nice avec les autres UIBarButtonItemname__s sans tous les hacks et le dimensionnement manuel des cadres de votre solution iOS 6 d'origine.

Une chose à noter - si vous envisagez d'ajouter ceci à un projet qui prend toujours en charge les systèmes d'exploitation antérieurs à iOS 7, assurez-vous de cocher la case de l'appel, sinon votre application se bloquera lors de l'exécution sur des systèmes d'exploitation plus anciens.

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

Voir cette section du guide de transition iOS 7: https://developer.Apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/Bars.html

Dans iOS 7, UISearchDisplayController inclut la propriété [.____. DisplaysSearchBarInNavigationBar, que vous pouvez utiliser pour placer une barre de recherche Dans une barre de navigation similaire à celle de Calendar sur . IPhone:

Autre remarque - vous devriez envisager de migrer vers AutoLayout à l'avenir afin de ne pas avoir à faire toute cette fastidieuse manipulation de trames. Apple le recommande, et probablement pour une bonne raison (futurs appareils avec des écrans plus grands ...?)

13
DiscDev

dans iOS 7 pour accéder à Text Field, vous devez réitérer au niveau supérieur. Changer votre code comme ça

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

Mais le meilleur moyen de nettoyer l'arrière-plan de UISearchBar et de définir l'icône de la barre de recherche dans le champ de texte est:

[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

Essayez ceci, je ne suis pas sûr, mais cela devrait fonctionner comme dans iOS 7, la barre de recherche a une sous-vue et à l'intérieur de cette sous-vue, il y a deux sous-vues dont l'une est 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

Créez un UIView * textFieldContainer avec votre cadre cible, ajoutez votre champ de texte à cet UIView, puis ajoutez ce textFieldContainer en tant qu'élément de navigation. c'est-à-dire que votre approche reste la même, le champ de texte vient à l'intérieur d'un conteneur et vous jouez avec ce conteneur.

2
Syed Absar

solution compatible 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

Solution rapide

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