IOS 6アプリと同じように、TextFieldを含むUISearchBarの外観を実現しようとしています。私はいくつかの方法でそれをコーディングしようとしましたが、まだ成功していません。問題は、iOS 7以降、TextFieldのフレームを変更できないことです。その結果、TextFieldはNavigationBarのすべてのスペースを取り、右側のUIBarButtonItem(メニューボタン)をオーバーライドします。以下の写真を参照してください。
iOS 6コード:これがiOS6でのコーディング方法です、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での上記のコードの結果:![iOS7の外観]
iOS 7コード:iOS 7との違いは、 UITextFieldをUISearchBar/UINavigationBarに追加するには、subViewsを使用する必要があります。これを行うことによって、私はまだそのフレームを変更することができませんでした。現在、このコードの下の画像に表示されている右側のmenuButtonとオーバーラップしています...
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 ... subViewのフレーム(TextField)を何らかの方法で変更することは可能ですか? :(
[〜#〜]編集[〜#〜]
答えはちょっと足りないです。 TextFieldの右側にボタンがあるios7でコードを機能させるには、TextFieldをnavigationBarのtitleViewとして設定する必要があります。これはiOS6には当てはまりませんでした。ただし、他の不具合が発生するため、iOS7のsearchBars内でTextFieldを使用することはお勧めしません。代わりにsearchDispalyControllerを使用してください。以下の私の答えを見てください
self.navigationItem.titleView = sbTextField;
IOS7ではUITextField
にUINavigationBar
を入れないでください。このウィジェットはすでにAppleによって提供されています。
IOS 7では、UISearchDisplayController
とUISearchBar
を使用して、次のように設定できます。
searchDisplayController.displaySearchBarInNavigationBar = YES
検索バーはUINavigationBar
に表示され、元のiOS6ソリューションのすべてのハックや手動のフレームサイズ設定なしで他のUIBarButtonItem
sとうまく連携します。
注意すべき点が1つあります。これを、iOS 7より古いOSを引き続きサポートするプロジェクトに追加する場合は、呼び出しの前後にチェックを入れてください。そうしないと、古いOSで実行するとアプリがクラッシュします。
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にdisplaysSearchBarInNavigationBarプロパティが含まれています。このプロパティを使用して、iPhoneのカレンダーと同様にナビゲーションバーに検索バーを配置できます。
もう1つの注意点-面倒なフレーム操作をすべて行う必要がないように、今後はAutoLayoutへの移行を検討する必要があります。 Appleはそれをお勧めします、そしておそらく正当な理由で(より大きな画面を備えた将来のデバイス...?)
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];
これを試してみてください。よくわかりませんが、iOS 7の検索バーにはサブビューがあり、そのサブビュー内には2つのサブビューがあります。そのうちの1つは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];
ターゲットフレームを使用してUIView * textFieldContainerを作成し、テキストフィールドをそのUIViewに追加してから、そのtextFieldContainerをナビゲーションアイテムとして追加します。つまり、テキストフィールドがコンテナ内にあり、そのコンテナで遊ぶだけで、アプローチは同じままです。
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];
}
}
}
迅速なソリューション
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
}
}
}