私はこれで髪をちぎりました。クライアントは、次の例のように、検索バーの左側にボタンを追加したいと考えています。
(ソース: erik.co.uk )
しかし、どうすればいいのかわからない。 Apple UISearchBarにカスタムボタンを追加するための文書化されたメソッドはもちろん、検索バーの左側にもありません。
インターフェースビルダーでハックして、左側にボタンのあるUIToolbarを追加しようとしましたが、2つが適切に並んでいて、1つであるような印象を与えるスタイルの組み合わせが見つかりません。下の図からわかるように、垂直方向の配置では常に1ピクセルの違いのように見えます。
(ソース: erik.co.uk )
私は周りを検索しましたが、答えを見つけることができませんが、スクリーンショットからわかるように、それは可能でなければなりません!
よろしくお願いします。
エリック
ツールバーの代わりにナビゲーションバーを使用します。検索バーをナビゲーションバーのタイトルビューに設定します。
Interface Builder
:
結果:
代わりにブックマーク画像を置き換え、必要に応じてそのオフセットを調整できます。
例えば:
_[self.searchDisplayController.searchBar setImage:[UIImage imageNamed:@"plus2"] forSearchBarIcon:UISearchBarIconBookmark state:UIControlStateNormal];
[self.searchDisplayController.searchBar setPositionAdjustment:UIOffsetMake(-10, 0) forSearchBarIcon:UISearchBarIconBookmark];
_
デリゲートメソッドでボタンイベントを処理します。
- (void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar
これはどのように見えるかです:
最初の解決策は、KennyTMが気づいたように、UINavigationBar
ではなくUIToolbar
を使用することです。しかし、私の場合のように、3つのボタンを使用する必要がある場合、ナビゲーションバーに満足できない場合があります(ナビゲーションバーは2つのボタンしか使用できません)。左の図を参照してください。これは私がそれをした方法です:
Toolbar
を使用し、検索バーを配置する場所でFlexible Space Bar Button Item
を使用します。Interface Builder
でこれを行うには、検索バーをツールバーにドラッグアンドドロップしないでください。代わりに、それを近くのどこかに置いてから、キーボードの矢印キーを使用して(またはInterface Builder
のXとYの位置を変更して)移動します。1px
と白い背景のあるビューを1つ追加します。少し汚れているように見えるので、もっと良い解決策があれば教えてください。
最も簡単な解決策は、ツールバーの(ではなく)TOPにSearchBarを追加することです。私は私のeBuildyで使用する最適なソリューションを提供します。
UIBarButtonItem *mySettingsButton = [[UIBarButtonItem alloc] initWithTitle:@"Settings" style:UIBarButtonItemStyleBordered target:self action:@selector(refresh)];
UIBarButtonItem *mySpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *myRefreshButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh)];
UIToolbar *myTopToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0,0,320,40)];
UISearchBar *mySearchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(70,1,220,40)];
[myTopToolbar setItems:[NSArray arrayWithObjects:mySettingsButton,mySpacer,myRefreshButton, nil] animated:NO];
[self.view addSubview:myTopToolbar];
[self.view addSubview:mySearchBar];
ここで古い質問に答えましたが、私は最近これに苦労していて、対処しようとしている状況の他の回答にはいくつかの欠点を見つけました。ここに私がUISearchBarのサブクラスでやったことがあります:
最初にUIButtonプロパティ(ここでは「selectButton」)を追加します。次に、initWithFrameメソッドをオーバーライドし、次のようなことを行います。
-(id)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame])
{
self.selectButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
self.selectButton.contentEdgeInsets = (UIEdgeInsets){.left=4,.right=4};
[self.selectButton addTarget:self action:@selector(pressedButton:) forControlEvents:UIControlEventTouchUpInside];
self.selectButton.titleLabel.numberOfLines = 1;
self.selectButton.titleLabel.adjustsFontSizeToFitWidth = YES;
self.selectButton.titleLabel.lineBreakMode = UILineBreakModeClip;
[self addSubview:self.selectButton];
[self.selectButton setFrame:CGRectMake(5, 6, 60, 31)];
}
return self;
}
ここで、レイアウトサブビューメソッドをオーバーライドして、キャンセルボタンが表示されているかどうかに応じて、検索バーのサイズを適切な幅に変更します。これは次のようになります。
-(void)layoutSubviews
{
[super layoutSubviews];
float cancelButtonWidth = 65.0;
UITextField *searchField = [self.subviews objectAtIndex:1];
if (self.showsCancelButton == YES)
[searchField setFrame:CGRectMake(70, 6, self.frame.size.width - 70 - cancelButtonWidth, 31)];
else
[searchField setFrame:CGRectMake(70, 6, self.frame.size.width - 70, 31)];
}
上記のメソッドで、cancelButtonWidthの定数を追加したことに注意してください。 [self cancelButton]から幅を取得するコードを追加しようとしましたが、実行時にのみアクセスできるようで、プロジェクトをコンパイルできません。いずれにしても、これはあなたが必要とするもののための良いスタートになるはずです
Cancel
ボタンの代わりに右側にカスタムボタンが必要な場合は、次のコードを使用してください(iOS 9以降で有効):
[self.searchBar setShowsCancelButton:YES];
[[UIBarButtonItem appearanceWhenContainedIn:[self.searchBar class], nil] setTitle:@""];
[[UIBarButtonItem appearanceWhenContainedIn:[self.searchBar class], nil] setImage:[UIImage imageNamed:@"search"]];