webentwicklung-frage-antwort-db.com.de

UITextField in UISearchBar unter iOS 7

Ich versuche, das gleiche Aussehen meiner UISearchBar mit einem TextField darin zu erzielen, wie in meiner iOS 6-App. Ich habe versucht, es auf verschiedene Arten zu codieren und war noch nicht erfolgreich. Das Problem ist, dass ich den TextField-Frame seit iOS 7 in keiner Weise ändern kann. Das Ergebnis ist, dass mein TextField den gesamten Platz in der Navigationsleiste einnimmt und das UIBarButtonItem (Menüschaltfläche) auf der rechten Seite überschreibt. Siehe Bilder unten:

Screenshots http://oi44.tinypic.com/2ufewx0.jpg

iOS 6-Code:So habe ich es in iOS 6 codiert, wo ich den TextFields-Frame nach Belieben einstellen konnte!

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

Das Ergebnis aus dem obigen Code in iOS 7: ! [IOS 7 Look]

iOS 7-Code:Der Unterschied in iOS 7 besteht darin, dass Sie Unteransichten verwenden müssen, um das UITextField zur UISearchBar/UINavigationBar hinzuzufügen Es überlappt derzeit den Menüknopf auf der rechten Seite, der im Bild unter diesem Code zu sehen ist ...

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 ... Ist es in irgendeiner Weise möglich, den Rahmen einer Unteransicht (TextField) zu ändern? :(

EDIT

Die Antwort ist ein bisschen lahm. Damit der Code in ios7 mit einer Schaltfläche rechts neben dem Textfeld funktioniert, muss das Textfeld als Titelansicht der Navigationsleiste festgelegt werden. Dies war in ios 6 nicht der Fall. Aber Es wird andere Störungen geben und es wird nicht empfohlen, TextField in searchBars in iOS7 zu verwenden. Verwenden Sie stattdessen searchDispalyController. Siehe meine Antwort unten

 self.navigationItem.titleView = sbTextField;
12
user1293618

Sie sollten in iOS 7 keine UITextField in die UINavigationBar einfügen, da dieses Widget bereits von Apple bereitgestellt wird.

In iOS 7 können Sie einfach eine UISearchDisplayController mit einer UISearchBar verwenden und Folgendes festlegen:

searchDisplayController.displaySearchBarInNavigationBar = YES

Die Suchleiste wird in Ihrer UINavigationBar angezeigt, und es wird Nice mit den anderen UIBarButtonItems ohne alle Hacks und manuellen Frame-Größen in Ihrer ursprünglichen iOS 6-Lösung abgespielt.

Beachten Sie Folgendes: Wenn Sie dies zu einem Projekt hinzufügen, das noch Betriebssysteme älter als iOS 7 unterstützt, sollten Sie sicherstellen, dass Sie den Anruf überprüfen, da Ihre App unter älteren Betriebssystemen sonst abstürzt.

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

Weitere Informationen finden Sie in diesem Abschnitt des iOS 7-Übergangshandbuchs: https://developer.Apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/Bars.html

In iOS 7 enthält UISearchDisplayController die Eigenschaft displaysSearchBarInNavigationBar, mit der Sie eine Suchleiste in eine Navigationsleiste einfügen können, ähnlich der im Kalender auf dem iPhone:

Ein weiterer Hinweis: Sie sollten in Betracht ziehen, in Zukunft auf AutoLayout zu migrieren, damit Sie nicht all diese mühsamen Bildmanipulationen durchführen müssen. Apple empfiehlt es, und wahrscheinlich aus gutem Grund (zukünftige Geräte mit größeren Bildschirmen ...?)

13
DiscDev

um in iOS 7 auf Textfeld zuzugreifen, müssen Sie auf einer höheren Ebene erneut vorgehen. Ändern Sie Ihren Code wie folgt

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

Der beste Weg, um das Backgournd der UISearchBar zu löschen und das Suchleistensymbol im Textfeld festzulegen, ist:

[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

Probieren Sie dies aus, ich bin mir nicht sicher, aber das sollte funktionieren, da die Suchleiste in iOS 7 eine Unteransicht hat und in dieser Unteransicht gibt es zwei Unteransichten, von denen eine UITextField ist

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

Erstellen Sie einen UIView * textFieldContainer mit Ihrem Zielframe, fügen Sie diesem UIView Ihr Textfeld hinzu und fügen Sie diesen textFieldContainer als Navigationselement hinzu. Das heißt, Ihr Ansatz bleibt derselbe, nur das Textfeld befindet sich in einem Container und Sie spielen mit diesem Container.

2
Syed Absar

iOS6 & iOS7 kompatible Lösung:

- (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

Schnelle Lösung

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