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];
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;
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 UIBarButtonItem
s 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 ...?)
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];
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];
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.
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];
}
}
}
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
}
}
}